diff options
Diffstat (limited to 'lib/ur/option.ur')
-rw-r--r-- | lib/ur/option.ur | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/ur/option.ur b/lib/ur/option.ur new file mode 100644 index 0000000..baa0846 --- /dev/null +++ b/lib/ur/option.ur @@ -0,0 +1,61 @@ +datatype t = datatype Basis.option + +val monad = mkMonad {Return = @@Some, + Bind = fn [a] [b] (m1 : t a) (m2 : a -> t b) => + case m1 of + None => None + | Some v => m2 v} + +fun eq [a] (_ : eq a) = + mkEq (fn x y => + case (x, y) of + (None, None) => True + | (Some x, Some y) => x = y + | _ => False) + +fun ord [a] (_ : ord a) = + mkOrd {Lt = fn x y => + case (x, y) of + (None, Some _) => True + | (Some x, Some y) => x < y + | _ => False, + Le = fn x y => + case (x, y) of + (None, _) => True + | (Some x, Some y) => x <= y + | _ => False} + +fun isNone [a] x = + case x of + None => True + | Some _ => False + +fun isSome [a] x = + case x of + None => False + | Some _ => True + +fun mp [a] [b] f x = + case x of + None => None + | Some y => Some (f y) + +fun app [m] [a] (_ : monad m) (f : a -> m {}) x = + case x of + None => return () + | Some y => f y + +fun bind [a] [b] f x = + case x of + None => None + | Some y => f y + +fun get [a] (x : a) (o : option a) = + case o of + None => x + | Some v => v + +fun unsafeGet [a] (o : option a) = + case o of + None => error <xml>Option.unsafeGet: encountered None</xml> + | Some v => v |