X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fhope_option.erl;h=c645c5388d63e0472c8eba6ce58af7d8ec8753cf;hb=0ed4baebe135edc50d24d3613c6ee971f75d8c98;hp=7a8743823e22c5d8be78f56a7ac83a2cb2cf3064;hpb=9a5e47faa30b6f3fbd9b0521b238c2d1076de498;p=hope.git diff --git a/src/hope_option.erl b/src/hope_option.erl index 7a87438..c645c53 100644 --- a/src/hope_option.erl +++ b/src/hope_option.erl @@ -7,15 +7,19 @@ ]). -export( - [ put/2 - , get/2 - , return/1 - , return/2 + % Generic monad interface + [ return/1 , map/2 - , iter/2 , pipe/2 + + % Specific to hope_option:t() + , return/2 + , put/2 + , get/2 + , iter/2 , of_result/1 , of_undefined/1 + , validate/2 ]). @@ -53,10 +57,13 @@ return(X, Condition) -> map({some, X}, F) -> {some, F(X)}; map(none , _) -> none. --spec iter(t(A), fun((A) -> (ok))) -> +-spec iter(t(A), fun((A) -> (any()))) -> + ok. +iter({some, X}, F) -> + _ = F(X), + ok; +iter(none, _) -> ok. -iter({some, X}, F) -> ok = F(X); -iter(none , _) -> ok. -spec pipe([fun((A) -> t(B))], A) -> t(B). @@ -77,3 +84,13 @@ of_result({error, _}) -> none. t(A). of_undefined(undefined) -> none; of_undefined(X) -> {some, X}. + +-spec validate(t(A), fun((A) -> boolean())) -> + t(A). +validate(none, _) -> + none; +validate({some, X}=T, F) -> + case F(X) + of false -> none + ; true -> T + end.