module Utils.List exposing ( groupBy , mean , links ) import Dict import Maybe.Extra as Maybe groupBy : (a -> comparable) -> List a -> List (comparable, List a) groupBy f xs = let addItem item dict = let groupItems = Dict.get (f item) dict |> Maybe.withDefault [] in Dict.insert (f item) (item :: groupItems) dict in List.foldr addItem Dict.empty xs |> Dict.toList mean : List Int -> Int mean xs = (List.sum xs) // (List.length xs) links : List a -> List (a, a) links xs = let reversed = List.reverse xs in List.foldr (\x acc -> case Maybe.map Tuple.first (List.head acc) of Just y -> (x, y) :: acc _ -> acc ) (case reversed of x :: y :: _ -> [(y, x)] _ -> [] ) (List.reverse << List.drop 2 <| reversed)