mtamc / and-collect / Maybe.AndCollect

andCollect : (a -> Maybe b) -> Maybe a -> Maybe ( a, b )

Combinator for interdependent Maybe values. Note the type signature similarities with Maybe.andThen:

andThen : (a -> Maybe b) -> Maybe a -> Maybe b

andCollect : (a -> Maybe b) -> Maybe a -> Maybe ( a, b )

Intended usage is turning interdependent Maybe values such as this...

computeAnswer : Maybe Int
computeAnswer =
    getA
        |> Maybe.andThen
            (\a ->
                getB a
                    |> Maybe.andThen
                        (\b ->
                            getC a b
                                |> Maybe.andThen
                                    (\c ->
                                        solve a b c
                                    )
                        )
            )

... into this:

import Maybe.AndCollect as Maybe

computeAnswer : Maybe Int
computeAnswer =
    getA
        |> Maybe.andCollect getB
        |> Maybe.andCollect (\( a, b ) -> getC a b)
        |> Maybe.andThen (\( ( a, b ), c ) -> solve a b c)