aboutsummaryrefslogtreecommitdiff
path: root/src/iodata.gleam
blob: 856832faeef2036e8e419843e5c556c76505b720 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import expect

// concat should work on List(Iodata)
// need a name for the string version

pub external type Iodata;

pub external fn prepend(Iodata, String) -> Iodata =
  "gleam__stdlib" "iodata_prepend";

pub external fn append(Iodata, String) -> Iodata =
  "gleam__stdlib" "iodata_append";

pub external fn concat(List(String)) -> Iodata =
  "gleam__stdlib" "identity";

pub external fn new(String) -> Iodata =
  "gleam__stdlib" "identity";

pub external fn to_string(Iodata) -> String =
  "erlang" "iolist_to_binary";

pub external fn byte_size(Iodata) -> Int =
  "erlang" "iolist_size";

test iodata {
  let iodata = new("ello")
    |> append(_, ",")
    |> append(_, " world!")
    |> prepend(_, "H")

  iodata
  |> to_string
  |> expect:equal(_, "Hello, world!")

  iodata
  |> byte_size
  |> expect:equal(_, 13)
}

pub external fn lowercase(Iodata) -> Iodata = "string" "lowercase"

test lowercase {
  ["Gleam", "Gleam"]
  |> concat
  |> lowercase
  |> to_string
  |> expect:equal(_, "gleamgleam")
}

pub external fn uppercase(Iodata) -> Iodata = "string" "uppercase"

test uppercase {
  ["Gleam", "Gleam"]
  |> concat
  |> uppercase
  |> to_string
  |> expect:equal(_, "GLEAMGLEAM")
}

pub external fn reverse(Iodata) -> Iodata = "string" "reverse"

enum Direction =
  | All

external fn erl_split(Iodata, String, Direction) -> List(Iodata) =
  "string" "split"

pub fn split(iodata, on) {
  erl_split(iodata, on, All)
}

test split {
  "Gleam,Erlang,Elixir"
  |> new
  |> split(_, ",")
  |> expect:equal(_, [new("Gleam"), new("Erlang"), new("Elixir")])

  ["Gleam, Erl", "ang,Elixir"]
  |> concat
  |> split(_, ", ")
  |> expect:equal(_, [new("Gleam"), concat(["Erl", "ang,Elixir"])])
}

external fn erl_replace(Iodata, String, String, Direction) -> Iodata =
  "string" "replace"

pub fn replace(iodata, pattern, replacement) {
  erl_replace(iodata, pattern, replacement, All)
}

pub external fn is_equal(Iodata, Iodata) -> Bool = "string" "equal"

test is_equal {
  new("12")
  |> is_equal(_, concat(["1", "2"]))
  |> expect:true

  new("12")
  |> is_equal(_, new("12"))
  |> expect:true

  new("12")
  |> is_equal(_, new("2"))
  |> expect:false
}

pub external fn is_empty(Iodata) -> Bool = "string" "is_empty"

test is_empty {
  new("")
  |> is_empty
  |> expect:true

  new("12")
  |> is_empty
  |> expect:false

  concat([])
  |> is_empty
  |> expect:true

  concat(["", ""])
  |> is_empty
  |> expect:true
}