aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2020-02-28 19:04:21 +0000
committerLouis Pilfold <louis@lpil.uk>2020-03-03 11:44:08 +0000
commitce42552f838a112642456d64c99ffcd6950aa61d (patch)
tree88f1848a0f343b2c84b59913687f2f50b40acf65
parentcb619735140ecffe3f9293fc7c496d35de00e998 (diff)
downloadgleam_stdlib-ce42552f838a112642456d64c99ffcd6950aa61d.tar.gz
gleam_stdlib-ce42552f838a112642456d64c99ffcd6950aa61d.zip
result.Option type alias
-rw-r--r--.github/workflows/ci.yml2
-rw-r--r--gen/src/gleam@list.erl18
-rw-r--r--gen/src/gleam@result.erl5
-rw-r--r--src/gleam/float.gleam3
-rw-r--r--src/gleam/int.gleam3
-rw-r--r--src/gleam/list.gleam32
-rw-r--r--src/gleam/map.gleam5
-rw-r--r--src/gleam/result.gleam8
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)
+}