From b19ab5180b28ca6e5dcab0dce68404c19f354dca Mon Sep 17 00:00:00 2001 From: tpoindex Date: Wed, 11 Sep 2019 22:47:39 -0600 Subject: [PATCH] maybe monad and friends maybe - return a tuple of (Nothing) or (Just,value) maybemap - apply map function when maybe has a value and wrap in another maybe; else when nothing return nothing maybevalue - return value of maybe; else when nothing return optional default args --- src/fun.sh | 40 ++++++++++++++++++++++++++++++++++++++++ test/maybe_test.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100755 test/maybe_test.sh diff --git a/src/fun.sh b/src/fun.sh index 48b0894..e1ad6d9 100755 --- a/src/fun.sh +++ b/src/fun.sh @@ -358,3 +358,43 @@ call() { local args=$@ tup $f $args } + +maybe() { + if [[ $# -eq 0 ]]; then + local arg + read arg + maybe "$arg" + else + local x="$*" + local value=$(echo $x | strip) + if [[ ${#value} -eq 0 ]]; then + tup Nothing + else + tup Just "$value" + fi + fi +} + +maybemap() { + local x + read x + if [[ $(tupl $x) = "Nothing" ]]; then + echo $x + else + local y=$(tupr "$x") + local r=$(echo "$y" | map "$@") + maybe "$r" + fi +} + +maybevalue() { + local default="$*" + local x + read x + if [[ $(tupl $x) = "Nothing" ]]; then + echo "$default" + else + echo $(tupr $x) + fi +} + diff --git a/test/maybe_test.sh b/test/maybe_test.sh new file mode 100755 index 0000000..1003179 --- /dev/null +++ b/test/maybe_test.sh @@ -0,0 +1,29 @@ +#! /bin/bash + +testMaybe() { + assertEquals '(Just,1)' "$(maybe 1)" + assertEquals '(Just,1)' "$(echo 1 | maybe)" + assertEquals '(Nothing)' "$(maybe '')" + assertEquals '(Nothing)' "$(maybe ' ')" + assertEquals '(Nothing)' "$(maybe ' ' ' ' ' ')" + assertEquals '(Nothing)' "$(echo | maybe)" + assertEquals '(Just,1 2 3)' "$(maybe 1 2 3)" + assertEquals '(Just,1 2 3)' "$(echo 1 2 3 | maybe)" +} + +testMaybemap() { + assertEquals '(Just,3)' "$(echo 1 | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo $(( a + 1 ))')" + assertEquals '(Nothing)' "$(echo | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo $(( a + 1 ))')" + + assertEquals '(Nothing)' "$(echo 1 | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo')" + assertEquals '(Nothing)' "$(echo 1 | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo' | maybemap lambda a . 'echo $(( a + 1 ))')" +} + +testMaybevalue() { + assertEquals 3 "$(echo 1 | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo $(( a + 1 ))' | maybevalue 0)" + assertEquals 0 "$(echo | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo $(( a + 1 ))' | maybevalue 0)" + assertEquals 'a b c' "$(echo | maybe | maybemap lambda a . 'echo $(( a + 1 ))' | maybemap lambda a . 'echo $(( a + 1 ))' | maybevalue a b c)" +} + + +. ./shunit2-init.sh