3 -behavior(hope_gen_monad).
42 -spec map(t(A, Error), fun((A) -> (B))) ->
46 map({error, _}=Error, _) ->
49 -spec map_error(t(A, B), fun((B) -> (C))) ->
51 map_error({ok, _}=Ok, _) ->
53 map_error({error, Reason}, F) ->
56 -spec tag_error(t(A, Reason), Tag) ->
58 tag_error({ok, _}=Ok, _) ->
60 tag_error({error, Reason}, Tag) ->
61 {error, {Tag, Reason}}.
68 , F :: fun((X) -> t(Ok, Error))
75 ; {ok, Y} -> pipe(Fs, Y)
78 -spec lift_exn(F) -> G
79 when F :: fun((A) -> B)
80 , G :: fun((A) -> t(B, exn_value(any())))
82 lift_exn(F) when is_function(F, 1) ->
83 ID = fun hope_fun:id/1,
84 lift_map_exn(F, ID, ID).
86 -spec lift_exn(F, ErrorTag) -> G
87 when F :: fun((A) -> B)
88 , G :: fun((A) -> t(B, {ErrorTag, exn_value(any())}))
90 lift_exn(F, ErrorTag) when is_function(F, 1) ->
91 ID = fun hope_fun:id/1,
92 Tag = fun (Reason) -> {ErrorTag, Reason} end,
93 lift_map_exn(F, ID, Tag).
95 -spec lift_map_exn(F, MapOk, MapError) -> G
96 when F :: fun((A) -> B)
97 , MapOk :: fun((B) -> C)
98 , MapError :: fun((exn_value(any())) -> Error)
99 , G :: fun((A) -> t(C, Error))
101 lift_map_exn(F, MapOk, MapError) when is_function(F, 1) ->
106 catch Class:Reason ->
107 {error, {Class, Reason}}
109 % Applying maps separately as to not unintentionally catch an exception
112 of {ok , _}=Ok -> map (Ok , MapOk)
113 ; {error, _}=Error -> map_error(Error, MapError)