#pragma once

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

	void ?{}( stack(T) & s, stack(T) t );
	void clear( stack(T) & s );
	void ?{}( stack(T) & s );
	void ^?{}( stack(T) & s);

	stack(T) ?=?( stack(T) & s, stack(T) t );
	_Bool empty( const stack(T) & s );
	void push( stack(T) & s, T value );
	T pop( stack(T) & s );
}
