Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion lib/deque.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ defmodule Deque do

defstruct size: 0, max_size: nil, list1: [], list2: []

@spec new(integer) :: t
@spec new(non_neg_integer) :: t
def new(max_size \\ 100) do
%Deque{max_size: max_size}
end

@spec append(t, value) :: t
def append(%Deque{max_size: 0}=deque, _value) do
deque
end
def append(%Deque{size: size, max_size: max_size, list1: [], list2: list2}=deque, value) when size < max_size do
%{deque | size: size + 1, list2: [value|list2]}
end
Expand All @@ -33,6 +36,9 @@ defmodule Deque do
end

@spec appendleft(t, value) :: t
def appendleft(%Deque{max_size: 0}=deque, _value) do
deque
end
def appendleft(%Deque{size: size, max_size: max_size, list1: list1, list2: []}=deque, value) when size < max_size do
%{deque | size: size + 1, list1: [value|list1]}
end
Expand Down
38 changes: 35 additions & 3 deletions test/deque_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ defmodule DequeTest do
use ExUnit.Case

test "new" do
deque = Deque.new(5)
assert deque.size == 0
assert deque.max_size == 5
0..10
|> Enum.each(fn max_size ->
deque = Deque.new(max_size)
assert deque.size == 0
assert deque.max_size == max_size
end)
end

test "append/appendleft/pop/popleft" do
Expand Down Expand Up @@ -35,14 +38,40 @@ defmodule DequeTest do
assert deque.list2 == []
end

test "append/appendleft/pop/popleft max_size=0" do
deque = Enum.reduce(1..6, Deque.new(0), &Deque.append(&2, &1))
assert deque.list1 == []
assert deque.list2 == []

deque = Enum.reduce(1..3, deque, &Deque.appendleft(&2, &1))
assert deque.list1 == []
assert deque.list2 == []

{value, deque} = Deque.pop(deque)
assert value == nil
assert deque.list1 == []
assert deque.list2 == []

{value, deque} = Deque.popleft(deque)
assert value == nil
assert deque.list1 == []
assert deque.list2 == []
end

test "enumerable" do
deque = Enum.reduce(1..6, Deque.new(5), &Deque.append(&2, &1))
assert Enum.to_list(deque) == [2, 3, 4, 5, 6]

deque = Enum.reduce(1..6, Deque.new(0), &Deque.append(&2, &1))
assert Enum.to_list(deque) == []
end

test "collectable/inspect" do
deque = Enum.into(1..6, Deque.new(5))
assert inspect(deque) == "#Deque<[2, 3, 4, 5, 6]>"

deque = Enum.into(1..6, Deque.new(0))
assert inspect(deque) == "#Deque<[]>"
end

test "take_while" do
Expand All @@ -51,6 +80,9 @@ defmodule DequeTest do

deque = gen_take_while(400..500, 10, 492)
assert Enum.to_list(deque) == [493, 494, 495, 496, 497, 498, 499, 500]

deque = gen_take_while(400..500, 0, 492)
assert Enum.to_list(deque) == []
end

defp gen_take_while(range, max_size, max_value) do
Expand Down