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