#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 );
