#pragma once

forall(otype T) struct stack_node;
forall(otype T) struct stack {
	stack_node(T)* head;
};

forall(otype T) void ?{}(stack(T)* s);
forall(otype T) void ?{}(stack(T)* s, stack(T) t);
forall(otype T) stack(T) ?=?(stack(T)* s, stack(T) t);
forall(otype T) void ^?{}(stack(T)* s);

forall(otype T) _Bool empty(const stack(T)* s);
forall(otype T) void push(stack(T)* s, T value);
forall(otype T) T pop(stack(T)* s);
forall(otype T) void clear(stack(T)* s);
