diff options
author | Louis Pilfold <louis@lpil.uk> | 2020-02-28 19:04:21 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-03-03 11:44:08 +0000 |
commit | ce42552f838a112642456d64c99ffcd6950aa61d (patch) | |
tree | 88f1848a0f343b2c84b59913687f2f50b40acf65 | |
parent | cb619735140ecffe3f9293fc7c496d35de00e998 (diff) | |
download | gleam_stdlib-ce42552f838a112642456d64c99ffcd6950aa61d.tar.gz gleam_stdlib-ce42552f838a112642456d64c99ffcd6950aa61d.zip |
result.Option type alias
-rw-r--r-- | .github/workflows/ci.yml | 2 | ||||
-rw-r--r-- | gen/src/gleam@list.erl | 18 | ||||
-rw-r--r-- | gen/src/gleam@result.erl | 5 | ||||
-rw-r--r-- | src/gleam/float.gleam | 3 | ||||
-rw-r--r-- | src/gleam/int.gleam | 3 | ||||
-rw-r--r-- | src/gleam/list.gleam | 32 | ||||
-rw-r--r-- | src/gleam/map.gleam | 5 | ||||
-rw-r--r-- | src/gleam/result.gleam | 8 |
8 files changed, 45 insertions, 31 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94080c7..615aff8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,6 @@ jobs: otp-version: 22.2 - uses: gleam-lang/setup-gleam@v1.0.1 with: - gleam-version: 0.6.0 + gleam-version: 0.7.0-rc1 - run: rebar3 install_deps - run: rebar3 eunit diff --git a/gen/src/gleam@list.erl b/gen/src/gleam@list.erl index c33dab2..3e6d01d 100644 --- a/gen/src/gleam@list.erl +++ b/gen/src/gleam@list.erl @@ -24,7 +24,7 @@ contains(List, Elem) -> head(List) -> case List of [] -> - {error, nil}; + gleam@result:none(); [X | _] -> {ok, X} @@ -33,7 +33,7 @@ head(List) -> tail(List) -> case List of [] -> - {error, nil}; + gleam@result:none(); [_ | Xs] -> {ok, Xs} @@ -172,7 +172,7 @@ fold_right(List, Initial, Fun) -> find(Haystack, IsDesired) -> case Haystack of [] -> - {error, nil}; + gleam@result:none(); [X | Rest] -> case IsDesired(X) of @@ -187,7 +187,7 @@ find(Haystack, IsDesired) -> find_map(Haystack, Fun) -> case Haystack of [] -> - {error, nil}; + gleam@result:none(); [X | Rest] -> case Fun(X) of @@ -258,19 +258,19 @@ intersperse(List, Elem) -> [X] -> [X]; - [X | Rest] -> - [X, Elem | intersperse(Rest, Elem)] + [X1 | Rest] -> + [X1, Elem | intersperse(Rest, Elem)] end. at(List, Index) -> case Index < 0 of true -> - {error, nil}; + gleam@result:none(); false -> case List of [] -> - {error, nil}; + gleam@result:none(); [X | Rest] -> case Index =:= 0 of @@ -396,5 +396,5 @@ key_find(KeywordList, DesiredKey) -> {ok, Value}; false -> - {error, nil} + gleam@result:none() end end). diff --git a/gen/src/gleam@result.erl b/gen/src/gleam@result.erl index 3aeae12..2484f56 100644 --- a/gen/src/gleam@result.erl +++ b/gen/src/gleam@result.erl @@ -1,7 +1,7 @@ -module(gleam@result). -compile(no_auto_import). --export([is_ok/1, is_error/1, map/2, map_error/2, flatten/1, then/2, unwrap/2]). +-export([is_ok/1, is_error/1, map/2, map_error/2, flatten/1, then/2, unwrap/2, none/0]). is_ok(Result) -> case Result of @@ -65,3 +65,6 @@ unwrap(Result, Default) -> {error, _} -> Default end. + +none() -> + {error, nil}. diff --git a/src/gleam/float.gleam b/src/gleam/float.gleam index 117467e..653a4d6 100644 --- a/src/gleam/float.gleam +++ b/src/gleam/float.gleam @@ -1,7 +1,8 @@ import gleam/iodata import gleam/order.{Order} +import gleam/result.{Option} -pub external fn parse(String) -> Result(Float, Nil) +pub external fn parse(String) -> Option(Float) = "gleam_stdlib" "parse_float"; pub fn to_string(f: Float) -> String { diff --git a/src/gleam/int.gleam b/src/gleam/int.gleam index c152be4..7fd7fa6 100644 --- a/src/gleam/int.gleam +++ b/src/gleam/int.gleam @@ -1,6 +1,7 @@ import gleam/order.{Order} +import gleam/result.{Option} -pub external fn parse(String) -> Result(Int, Nil) = "gleam_stdlib" "parse_int"; +pub external fn parse(String) -> Option(Int) = "gleam_stdlib" "parse_int"; pub external fn to_string(Int) -> String = "erlang" "integer_to_binary" diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam index 527c1c8..eaa0b23 100644 --- a/src/gleam/list.gleam +++ b/src/gleam/list.gleam @@ -1,6 +1,7 @@ import gleam/int -import gleam/order.{Order} import gleam/pair +import gleam/order.{Order} +import gleam/result.{Option} pub type LengthMismatch { LengthMismatch @@ -25,16 +26,16 @@ pub fn contains(list: List(a), has elem: a) -> Bool { } } -pub fn head(list: List(a)) -> Result(a, Nil) { +pub fn head(list: List(a)) -> Option(a) { case list { - [] -> Error(Nil) + [] -> result.none() [x | _] -> Ok(x) } } -pub fn tail(list: List(a)) -> Result(List(a), Nil) { +pub fn tail(list: List(a)) -> Option(List(a)) { case list { - [] -> Error(Nil) + [] -> result.none() [_ | xs] -> Ok(xs) } } @@ -83,7 +84,6 @@ pub fn index_map(list: List(a), with fun: fn(Int, a) -> b) -> List(b) { do_index_map(list, fun, 0, []) } -// fn do_traverse(list: List(a), fun: fn(a) -> Result(b, e), acc: List(b)) -> Result(List(b), e) { fn do_traverse( list: List(a), fun: fn(a) -> Result(b, e), @@ -171,9 +171,9 @@ pub fn fold_right( pub fn find( in haystack: List(a), one_that is_desired: fn(a) -> Bool, -) -> Result(a, Nil) { +) -> Option(a) { case haystack { - [] -> Error(Nil) + [] -> result.none() [x | rest] -> case is_desired(x) { True -> Ok(x) @@ -184,10 +184,10 @@ pub fn find( pub fn find_map( in haystack: List(a), - with fun: fn(a) -> Result(b, Nil), -) -> Result(b, Nil) { + with fun: fn(a) -> Option(b), +) -> Option(b) { case haystack { - [] -> Error(Nil) + [] -> result.none() [x | rest] -> case fun(x) { Ok(x) -> Ok(x) @@ -241,12 +241,12 @@ pub fn intersperse(list: List(a), with elem: a) -> List(a) { } } -pub fn at(in list: List(a), get index: Int) -> Result(a, Nil) { +pub fn at(in list: List(a), get index: Int) -> Option(a) { case index < 0 { - True -> Error(Nil) + True -> result.none() False -> case list { - [] -> Error(Nil) + [] -> result.none() [x | rest] -> case index == 0 { True -> Ok(x) @@ -354,12 +354,12 @@ pub fn split_while( pub fn key_find( in keyword_list: List(tuple(k, v)), find desired_key: k, -) -> Result(v, Nil) { +) -> Option(v) { find_map(keyword_list, fn(keyword) { let tuple(key, value) = keyword case key == desired_key { True -> Ok(value) - False -> Error(Nil) + False -> result.none() } }) } diff --git a/src/gleam/map.gleam b/src/gleam/map.gleam index a57605a..848d5a6 100644 --- a/src/gleam/map.gleam +++ b/src/gleam/map.gleam @@ -1,5 +1,6 @@ import gleam/result import gleam/list +import gleam/result.{Option} pub external type Map(key, value); @@ -22,7 +23,7 @@ pub fn has_key(map: Map(k, v), key: k) -> Bool { pub external fn new() -> Map(key, value) = "maps" "new" -pub external fn get(from: Map(key, value), get: key) -> Result(value, Nil) +pub external fn get(from: Map(key, value), get: key) -> Option(value) = "gleam_stdlib" "map_get"; external fn erl_insert(key, value, Map(key, value)) -> Map(key, value) @@ -80,7 +81,7 @@ pub fn drop(from map: Map(k, v), drop disallowed_keys: List(k)) -> Map(k, v) { pub fn update( in map: Map(k, v), update key: k, - with fun: fn(Result(v, Nil)) -> v, + with fun: fn(Option(v)) -> v, ) -> Map(k, v) { map |> get(_, key) |> fun |> insert(map, key, _) } diff --git a/src/gleam/result.gleam b/src/gleam/result.gleam index 28b7d96..9abbaea 100644 --- a/src/gleam/result.gleam +++ b/src/gleam/result.gleam @@ -58,3 +58,11 @@ pub fn unwrap(result: Result(a, e), or default: a) -> a { Error(_) -> default } } + +// A value that is either there or not there +pub type Option(value) = + Result(value, Nil) + +pub fn none() -> Option(a) { + Error(Nil) +} |