X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fhope_option.erl;h=7a8743823e22c5d8be78f56a7ac83a2cb2cf3064;hb=refs%2Ftags%2F2.3.0;hp=180c41687cd7ea5582c8c6901b5fba7dbba8e72e;hpb=4af0774b16181c76d0deedf0911d53409c8f1078;p=hope.git diff --git a/src/hope_option.erl b/src/hope_option.erl index 180c416..7a87438 100644 --- a/src/hope_option.erl +++ b/src/hope_option.erl @@ -1,6 +1,6 @@ -module(hope_option). --behavior(hope_monad). +-behavior(hope_gen_monad). -export_type( [ t/1 @@ -10,10 +10,12 @@ [ put/2 , get/2 , return/1 + , return/2 , map/2 , iter/2 , pipe/2 , of_result/1 + , of_undefined/1 ]). @@ -26,10 +28,7 @@ -spec put(A, fun((A) -> boolean())) -> t(A). put(X, F) -> - case F(X) - of true -> {some, X} - ; false -> none - end. + return(X, F). -spec get(t(A), Default :: A) -> A. @@ -41,6 +40,14 @@ get(none , Y) -> Y. return(X) -> {some, X}. +-spec return(A, fun((A) -> boolean())) -> + t(A). +return(X, Condition) -> + case Condition(X) + of true -> {some, X} + ; false -> none + end. + -spec map(t(A), fun((A) -> (B))) -> t(B). map({some, X}, F) -> {some, F(X)}; @@ -65,3 +72,8 @@ pipe([F|Fs], X) -> 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}.