diff options
-rw-r--r-- | users/sterni/nix/list/default.nix | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/users/sterni/nix/list/default.nix b/users/sterni/nix/list/default.nix new file mode 100644 index 000000000000..568a76d637a1 --- /dev/null +++ b/users/sterni/nix/list/default.nix @@ -0,0 +1,30 @@ +{ ... }: + +{ + /* For a list of length n that consists of lists of length m, + return a list of length m containing lists of length n + so that + + builtins.elemAt (builtins.elemAt orig a) b + == builtins.elemAt (builtins.elemAt transposed b) a + + Essentially, if you think of the nested list as an array with two + dimensions, the two index axes are swapped. + + The length of the inner lists m is determined based on the first element + and assumed to be used for all other lists. Malformed input data may + cause the function to crash or lose data. + + Type: <n>[ <m>[ ] ] -> <m>[ <n>[ ] ] + */ + transpose = list: + let + innerLength = builtins.length (builtins.head list); + outerLength = builtins.length list; + in + builtins.genList + (inner: builtins.genList + (outer: builtins.elemAt (builtins.elemAt list outer) inner) + outerLength) + innerLength; +} |