aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
5 files changed, 31 insertions, 20 deletions
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)
+}