   # just for reference mainly
   @contexts { :string, :number, :decimal, :exponent, :array, :object, :pair, :key, :value, :boolean, :comma_or_close_array, :comma_or_close_object }
   @whitespace '\s\n\t\r'
-  @number_start '-0123456789'
   @digits ?0..?9
+  @number_start [?- | (@digits |> Enum.to_list)]
 
   @doc """
   The entry point. A "value" is expected, so that context is pushed onto the stack.

  def parse(<<?}, t::binary>>, [:pair, :object | context], output) do
    debug "Closing pair context", t, context, output
    parse(<<?}>> <> t, [:object | context], output)
  end

  @doc """

  end

  @doc """
  Drop number context if no more digits inside an array, then expect comma_or_close_array.
  """
  def parse(<<n, t::binary>>, [:number, :array | context], output) when not n in @digits do
    debug "Dropping number context and expecting comma or end-array", t, context, output
    parse(<<n>> <> t, [:comma_or_close_array, :array | context], output)
  end

  @doc """
  Drop number context if no more digits.
  """
  def parse(<<n, t::binary>>, [:number | context], output) when not n in @digits do
