#lang planet chongkai/sml signature Option = sig val getOpt : 'a option * 'a -> 'a val isSome : 'a option -> bool val valOf : 'a option -> 'a val filter : ('a -> bool) -> 'a -> 'a option val map : ('a -> 'b) -> 'a option -> 'b option val app : ('a -> unit) -> 'a option -> unit val join : 'a option option -> 'a option val compose : ('a -> 'b) * ('c -> 'a option) -> ('c -> 'b option) val mapPartial : ('a -> 'b option) -> ('a option -> 'b option) val composePartial : ('a -> 'b option) * ('c -> 'a option) -> ('c -> 'b option) end structure Option :> Option = struct fun getOpt (SOME v, _) = v | getOpt (NONE, a) = a; fun isSome (SOME _) = true | isSome NONE = false; fun valOf (SOME v) = v | valOf NONE = raise Option; fun filter p x = if p x then SOME x else NONE fun map f NONE = NONE | map f (SOME x) = SOME (f x) fun app f NONE = () | app f (SOME x) = f x fun join NONE = NONE | join (SOME x) = x fun mapPartial f NONE = NONE | mapPartial f (SOME x) = f x fun compose (f, g) x = case g x of NONE => NONE | SOME y => SOME (f y) fun composePartial (f, g) x = case g x of NONE => NONE | SOME y => f y end