Packages
inplace
0.7.12
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Mutable data structures
Current section
Files
Jump to
Current section
Files
lib/adt/stack.ex
defmodule InPlace.Stack do
alias InPlace.Array
def new(max_capacity) when is_integer(max_capacity) and max_capacity > 0 do
Array.new(max_capacity + 1, 0)
end
def size(stack) do
Array.get(stack, 1)
end
def peek(stack) do
case size(stack) do
0 -> nil
t_idx -> Array.get(stack, t_idx + 1)
end
end
def empty?(stack) do
size(stack) == 0
end
def pop(stack) do
peek(stack)
|> tap(fn top -> is_nil(top) || :atomics.sub(stack, 1, 1) end)
end
def push(stack, value) when is_integer(value) do
if size(stack) == Array.size(stack) - 1 do
throw({:error, :stackoverflow})
else
new_size = :atomics.add_get(stack, 1, 1)
Array.put(stack, new_size + 1, value)
end
end
def to_list(stack) do
Array.to_list(stack)
|> tl
|> Enum.take(size(stack))
end
end