3 -behavior(hope_gen_monad).
13 , map/2 % map/2 is alias for map_ok/2
43 -spec map(t(A, Error), fun((A) -> (B))) ->
48 -spec map_ok(t(A, Error), fun((A) -> (B))) ->
52 map_ok({error, _}=Error, _) ->
55 -spec map_error(t(A, B), fun((B) -> (C))) ->
57 map_error({ok, _}=Ok, _) ->
59 map_error({error, Reason}, F) ->
62 -spec tag_error(t(A, Reason), Tag) ->
64 tag_error({ok, _}=Ok, _) ->
66 tag_error({error, Reason}, Tag) ->
67 {error, {Tag, Reason}}.
74 , F :: fun((X) -> t(Ok, Error))
81 ; {ok, Y} -> pipe(Fs, Y)
84 -spec lift_exn(F) -> G
85 when F :: fun((A) -> B)
86 , G :: fun((A) -> t(B, exn_value(any())))
88 lift_exn(F) when is_function(F, 1) ->
89 ID = fun hope_fun:id/1,
90 lift_map_exn(F, ID, ID).
92 -spec lift_exn(F, ErrorTag) -> G
93 when F :: fun((A) -> B)
94 , G :: fun((A) -> t(B, {ErrorTag, exn_value(any())}))
96 lift_exn(F, ErrorTag) when is_function(F, 1) ->
97 ID = fun hope_fun:id/1,
98 Tag = fun (Reason) -> {ErrorTag, Reason} end,
99 lift_map_exn(F, ID, Tag).
101 -spec lift_map_exn(F, MapOk, MapError) -> G
102 when F :: fun((A) -> B)
103 , MapOk :: fun((B) -> C)
104 , MapError :: fun((exn_value(any())) -> Error)
105 , G :: fun((A) -> t(C, Error))
107 lift_map_exn(F, MapOk, MapError) when is_function(F, 1) ->
112 catch Class:Reason ->
113 {error, {Class, Reason}}
115 % Applying maps separately as to not unintentionally catch an exception
118 of {ok , _}=Ok -> map_ok (Ok , MapOk)
119 ; {error, _}=Error -> map_error(Error, MapError)