diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/common.milch | 11 | ||||
| -rw-r--r-- | core/maybe.milch | 30 | ||||
| -rw-r--r-- | core/result.milch | 25 |
3 files changed, 38 insertions, 28 deletions
diff --git a/core/common.milch b/core/common.milch index 55fa2b8..2aa72a2 100644 --- a/core/common.milch +++ b/core/common.milch @@ -141,11 +141,18 @@ (let split-by (\[delim vals] (_split-by delim [] vals))) -(let at (\[n seq] +(let at! (\![n seq] (match seq - [] (fatal! (fmt "at out of bounds, n: {0}" [n])) + [] (fatal! (fmt "at out of bounds, index: {0}" [n])) otherwise (match n 0 (head seq) + otherwise (at! (- n 1) (tail seq)))))) + +(let at (\[n seq] + (match seq + [] (Result/ex (fmt "at out of bounds, index: {0}" [n])) + otherwise (match n + 0 (Result/ok (head seq)) otherwise (at (- n 1) (tail seq)))))) (let maximum (\[vals] diff --git a/core/maybe.milch b/core/maybe.milch index ef9e906..eaf2093 100644 --- a/core/maybe.milch +++ b/core/maybe.milch @@ -16,29 +16,7 @@ "Maybe/Just" (f (Maybe/Just/get-value m)) "Maybe/Nothing" (Maybe/nothing)))) -; TESTING - -;; (let print-line! (\[s] -;; (print! (concat s "\n")))) - -;; (let a (Maybe/just 10)) -;; (let b (Maybe/nothing)) - -;; (Maybe/map (+ 5) a) -;; (Maybe/map (+ 5) b) - -;; (Maybe/and-then (\[n] (Maybe/just (+ n 5))) a) -;; (Maybe/and-then (\[n] (Maybe/just (+ n 5))) b) - -;; (let m (Maybe/just 10)) -;; (match m -;; (Maybe/just _) -;; (print-line! (fmt "found just {0}!" [(Maybe/Just/get-value m)])) -;; (Maybe/nothing) -;; (print-line! "found nothing!")) - -;; (let m (Maybe/just 10)) -;; (pipe m [ -;; (Maybe/map (+ 5)) -;; (Maybe/and-then (\[val] (Maybe/just (- val 3)))) -;; ]) +(let Maybe/default (\[default m] + (match (kind m) + "Maybe/Just" (ok-f (Maybe/Just/get-value m)) + "Result/Ex" default))) diff --git a/core/result.milch b/core/result.milch new file mode 100644 index 0000000..897a540 --- /dev/null +++ b/core/result.milch @@ -0,0 +1,25 @@ +(record Result/Ok value) +(record Result/Ex value) + +(let Result/ok Result/Ok/create) +(let Result/ex Result/Ex/create) + +(let Result/map (\[f m] + (match (kind m) + "Result/Ok" (Result/ok (f (Result/Ok/get-value m))) + "Result/Ex" m))) + +(let Result/map-ex (\[f m] + (match (kind m) + "Result/Ok" m + "Result/Ex" (Result/ex (f (Result/Ex/get-value m)))))) + +(let Result/and-then (\[f m] + (match (kind m) + "Result/Ok" (f (Result/Ok/get-value m)) + "Result/Ex" m))) + +(let Result/try (\[catch-f m] + (match (kind m) + "Result/Ok" (Result/Ok/get-value m) + "Result/Ex" (catch-f (Result/Ex/get-value m))))) |
