   @minus_sign ?-
   @full_stop ?.
   @exps 'eE'
-  @exp ?e
   @quotation_mark ?"
   @escape ?\\
   @escapes %{

    {result, data, pos}
  end

  defp float(<<char>> <> _data, pos, [@full_stop|_])
    when char in @exps,
    do: throw {:float, pos}
  defp float(<<char>> <> data, pos, chars)
    when char in @exps,
    do: exponential(data, pos + 1, [chars, 'e'], :exp)
  defp float(<<char>> <> data, pos, chars)
    when char in @digits,
    do: float(data, pos + 1, [chars, char])
  defp float(data, pos, chars) do
    result = chars
             |> IO.iodata_to_binary
             |> String.to_float

    do: map(data, pos + 1, [])
  defp json(<<char>> <> data, pos)
    when char in '-0123456789',
    do: number(data, pos + 1, [char], (if char == ?-, do: :minus, else: :digit))
  defp json(<<"true">> <> data, pos),
    do: {true, data, pos + 4}
  defp json(<<"false">> <> data, pos),
