X-Git-Url: https://git.xandkar.net/?p=hope.git;a=blobdiff_plain;f=src%2Fhope_option.erl;h=529158d06f04c1642292947af1ac57551c39a4f4;hp=d820b7bc90b2d10ba719508c8f4182c08497c678;hb=f2e1fffc2e9ce505ae1891a2251ae2036ed13422;hpb=27a4f25fb636bbff0f8085d66e433125dc5fe17d diff --git a/src/hope_option.erl b/src/hope_option.erl index d820b7b..529158d 100644 --- a/src/hope_option.erl +++ b/src/hope_option.erl @@ -1,5 +1,6 @@ -module(hope_option). +-behavior(hope_monad). -export_type( [ t/1 @@ -8,8 +9,12 @@ -export( [ put/2 , get/2 + , return/1 , map/2 , iter/2 + , pipe/2 + , of_result/1 + , of_undefined/1 ]). @@ -32,6 +37,11 @@ put(X, F) -> get({some, X}, _) -> X; get(none , Y) -> Y. +-spec return(A) -> + {some, A}. +return(X) -> + {some, X}. + -spec map(t(A), fun((A) -> (B))) -> t(B). map({some, X}, F) -> {some, F(X)}; @@ -41,3 +51,23 @@ map(none , _) -> none. ok. iter({some, X}, F) -> ok = F(X); iter(none , _) -> ok. + +-spec pipe([fun((A) -> t(B))], A) -> + t(B). +pipe([], X) -> + return(X); +pipe([F|Fs], X) -> + case F(X) + of none -> none + ; {some, Y} -> pipe(Fs, Y) + end. + +-spec of_result(hope_result:t(A, _B)) -> + t(A). +of_result({ok, X}) -> {some, X}; +of_result({error, _}) -> none. + +-spec of_undefined(undefined | A) -> + t(A). +of_undefined(undefined) -> none; +of_undefined(X) -> {some, X}.