aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2022-12-06 21:18:18 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2022-12-06 21:36:54 +0200
commit6b9782ce4a36e93156426b5747efcc90401b6251 (patch)
tree3a7c68ee5eb3a03ec00a0dd850bb8512eec5b84a /core
parent35bf45fe54788c6fca6b105b65fc1622a4bb7d34 (diff)
Add core/result.milch
Diffstat (limited to 'core')
-rw-r--r--core/common.milch11
-rw-r--r--core/maybe.milch30
-rw-r--r--core/result.milch25
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)))))