diff --git a/src/List/Extra.elm b/src/List/Extra.elm index 580d2db..68816b4 100644 --- a/src/List/Extra.elm +++ b/src/List/Extra.elm @@ -813,28 +813,18 @@ If some rows are shorter than the following rows, their elements are skipped: -} transpose : List (List a) -> List (List a) -transpose = - transposeHelp [] +transpose listOfLists = + List.foldr (List.map2 (::)) (List.repeat (rowsLength listOfLists) []) listOfLists -transposeHelp : List (List a) -> List (List a) -> List (List a) -transposeHelp acc ll = - case ll of +rowsLength : List (List a) -> Int +rowsLength listOfLists = + case listOfLists of [] -> - acc - - [] :: xss -> - transposeHelp acc xss + 0 - (x :: xs) :: xss -> - let - heads = - filterMap head xss - - tails = - filterMap tail xss - in - transposeHelp (acc ++ [ x :: heads ]) (xs :: tails) + x :: _ -> + List.length x {-| Return the list of all subsequences of a list. diff --git a/tests/Tests.elm b/tests/Tests.elm index e0d1c47..0936034 100644 --- a/tests/Tests.elm +++ b/tests/Tests.elm @@ -118,11 +118,11 @@ all = Expect.equal (transpose [ [ 1, 2, 3 ], [ 4, 5, 6 ] ]) [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ] - , test "short rows are skipped" <| + , test "truncate the matrix to the shortest row size" <| \() -> Expect.equal - (transpose [ [ 10, 11 ], [ 20 ], [], [ 30, 31, 32 ] ]) - [ [ 10, 20, 30 ], [ 11, 31 ], [ 32 ] ] + (transpose [ [ 10, 11 ], [ 20 ], [ 30, 31, 32 ] ]) + [ [ 10, 20, 30 ] ] , test "transposes large lists" <| \() -> Expect.equal