TODO
generator() :: StreamData.t(term())
t() :: term()
gen(t(), [{[atom()], (() -> generator())}]) :: {:ok, generator()} | {:error, reason :: term()}