From aa5b686ea86ad795b1c25ba47a3bc4286c93090e Mon Sep 17 00:00:00 2001 From: radrow Date: Thu, 18 Jul 2019 14:13:28 +0200 Subject: [PATCH] Option stliv --- src/.#aeso_stdlib.erl | 1 + src/aeso_stdlib.erl | 82 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-) create mode 120000 src/.#aeso_stdlib.erl diff --git a/src/.#aeso_stdlib.erl b/src/.#aeso_stdlib.erl new file mode 120000 index 0000000..4d1b76a --- /dev/null +++ b/src/.#aeso_stdlib.erl @@ -0,0 +1 @@ +radek@radek-VirtualBox.2106:1563435182 \ No newline at end of file diff --git a/src/aeso_stdlib.erl b/src/aeso_stdlib.erl index 560de69..8392d6d 100644 --- a/src/aeso_stdlib.erl +++ b/src/aeso_stdlib.erl @@ -18,6 +18,7 @@ stdlib() -> stdlib_list() -> [ {<<"List.aes">>, std_list()} , {<<"Func.aes">>, std_func()} + , {<<"Option.aes">>, std_option()} ]. std_func() -> @@ -153,7 +154,7 @@ namespace List = [] => acc h::t => foldl(rcons, rcons(acc, h), t) - function foreach(f : 'a => 'b, l : list('a)) : () = + function foreach(f : 'a => (), l : list('a)) : () = switch(l) [] => () e :: l' => @@ -271,3 +272,82 @@ namespace List = h::t => enumerate_(t, n + 1, (n, h)::acc) ". + +std_option() -> " +include \"List.aes\" + +namespace Option = + + function is_none(o : option('a)) : bool = switch(o) + None => true + Some(_) => false + + function is_some(o : option('a)) : bool = switch(o) + None => false + Some(_) => true + + + function match(n : 'b, s : 'a => 'b, o : option('a)) : 'b = switch(o) + None => n + Some(x) => s(x) + + function default(def : 'a, o : option('a)) : 'a = match(def, (x) => x, o) + + function force(o : option('a)) : 'a = default(abort(\"Forced None value\"), o) + + function on_elem(f : 'a => (), o : option('a)) : () = match((), f, o) + + + function map(f : 'a => 'b, o : option('a)) : option('b) = switch(o) + None => None + Some(x) => Some(f(x)) + + function map2(f : ('a, 'b) => 'c + , o1 : option('a) + , o2 : option('b) + ) : option('c) = switch((o1, o2)) + (Some(x1), Some(x2)) => Some(f(x1, x2)) + _ => None + + function map3( f : ('a, 'b, 'c) => 'd + , o1 : option('a) + , o2 : option('b) + , o3 : option('c) + ) : option('d) = switch((o1, o2, o3)) + (Some(x1), Some(x2), Some(x3)) => Some(f(x1, x2, x3)) + _ => None + + function app_over(f : option ('a => 'b), o : option('a)) : option('b) = switch((f, o)) + (Some(ff), Some(xx)) => Some(ff(xx)) + _ => None + + function flat_map(f : 'a => option('b), o : option('a)) : option('b) = switch(o) + None => None + Some(x) => f(x) + + + function to_list(o : option('a)) : list('a) = switch(o) + None => [] + Some(x) => [x] + + function filter_options(l : list(option('a))) : list('a) = filter_options_(l, []) + private function filter_options_(l : list (option('a)), acc : list('a)) : list('a) = switch(l) + [] => List.reverse(acc) + None::t => filter_options_(t, acc) + Some(x)::t => filter_options_(t, x::acc) + + function seq_options(l : list (option('a))) : option (list('a)) = seq_options_(l, []) + private function seq_options_(l : list (option('a)), acc : list('a)) : option(list('a)) = switch(l) + [] => Some(List.reverse(acc)) + None::t => None + Some(x)::t => seq_options_(t, x::acc) + + + function choose(o1 : option('a), o2 : option('a)) : option('a) = + if(is_some(o1)) o1 else o2 + + function choose_first(l : list(option('a))) : option('a) = switch(l) + [] => None + None::t => choose_first(t) + Some(x)::_ => Some(x) +".