aboutsummaryrefslogtreecommitdiff
path: root/learn-you-some-erlang/fifo_types.erl
diff options
context:
space:
mode:
Diffstat (limited to 'learn-you-some-erlang/fifo_types.erl')
-rw-r--r--learn-you-some-erlang/fifo_types.erl35
1 files changed, 35 insertions, 0 deletions
diff --git a/learn-you-some-erlang/fifo_types.erl b/learn-you-some-erlang/fifo_types.erl
new file mode 100644
index 0000000..d1bf4ed
--- /dev/null
+++ b/learn-you-some-erlang/fifo_types.erl
@@ -0,0 +1,35 @@
+-module(fifo_types).
+-export([new/0, push/2, pop/1, empty/1]).
+-export([test/0]).
+
+-spec new() -> {fifo, [], []}.
+new() -> {fifo, [], []}.
+
+-spec push({fifo, In::list(), Out::list()}, term()) -> {fifo, list(), list()}.
+push({fifo, In, Out}, X) -> {fifo, [X|In], Out}.
+
+-spec pop({fifo, In::list(), Out::list()}) -> {term(), {fifo, list(), list()}}.
+pop({fifo, [], []}) -> erlang:error('empty fifo');
+pop({fifo, In, []}) -> pop({fifo, [], lists:reverse(In)});
+pop({fifo, In, [H|T]}) -> {H, {fifo, In, T}}.
+
+%-spec empty({fifo, [], []}) -> true;
+% ({fifo, list(), list()}) -> false.
+%-spec empty({fifo, [], []}) -> true;
+% ({fifo, [any(), ...], [any(), ...]}) -> false.
+-spec empty({fifo, [], []}) -> true;
+ ({fifo, [any(), ...], []}) -> false;
+ ({fifo, [], [any(), ...]}) -> false;
+ ({fifo, [any(), ...], [any(), ...]}) -> false.
+empty({fifo, [], []}) -> true;
+empty({fifo, _, _}) -> false.
+
+test() ->
+ N = new(),
+ {2, N2} = pop(push(push(new(), 2), 5)),
+ {5, N3} = pop(N2),
+ N = N3,
+ true = empty(N3),
+ false = empty(N2),
+ %pop({fifo, [a|b], [e]}).
+ pop({fifo, [a, b], [e]}).