name() :: atom() | binary()
t() :: %Grumble.Type{name: name() | [], param: t() | nil, required: boolean()}
new(name :: name() | [], set :: list()) :: t()
set(type :: t(), set :: list()) :: t()