anchor.diff:  %%      or throws if there is no form to read.
   -spec read(binary(), opts(), clj_env:env()) -> any().
   read(Src, Opts, Env) ->
  -  State = new_state(Src, Env, Opts, false),
  -  ensure_read(dispatch(State)).
  +  State = new_state(Src, Env, Opts),
  +  ensure_read(State).
  +
  +%% @doc Read all forms.
  +-spec read_all(state()) -> [any()].
  +read_all(Src) ->
  +  read_all(Src, #{}).
  +
  +-spec read_all(state(), opts()) -> [any()].
  +read_all(Src, Opts) ->
  +  read_all(Src, Opts, clj_env:default()).
  +
  +-spec read_all(state(), opts(), clj_env:env()) -> [any()].
  +read_all(Src, Opts, Env) ->
  +  State = new_state(Src, Env, Opts),
  +  #{forms := Forms} = do_read_all(State),
  +  lists:reverse(Forms).
  +
  +%%------------------------------------------------------------------------------
  +%% Internal functions
  +%%------------------------------------------------------------------------------
  +
  +%% @private
  +-spec new_state(binary(), any(), opts()) -> state().
  +new_state(Src, Env, Opts) ->
  +  #{ src           => Src
  +   , opts          => Opts
  +   , forms         => []
  +   , pending_forms => []
  +   , env           => Env
  +   , loc           => {1, 1}
  +   , bindings      => clj_scope:new()
  +   }.
   
   %% @doc Makes sure a single form is read unless we reach
  -%%      the enf of file.
  +%%      the enf of file. It handles the case were an ignore
  +%%      reader is used.
   %% @private
   -spec ensure_read(state()) -> any().
   ensure_read(#{src := <<>>, forms := []} = State) ->
  
positive.code: -spec read_fold(read_fold_fun(), binary(), opts(), clj_env:env()) ->
    clj_env:env().
  read_fold(Fun, Src, Opts, Env) ->
    State = new_state(Src, Env, Opts, false),
    read_fold_loop(Fun, State).
  
  -spec read_fold_loop(read_fold_fun(), state()) -> clj_env:env().
  read_fold_loop(Fun, State) ->
    case dispatch(State) of
      %% Only finish when there is no more source to consume
      #{src := <<>>, forms := [], env := Env} ->
        Env;
  
negative.code:     end,
    Char =
      case Token of
        Ch when size(Ch) == 1 -> Ch;
        <<"newline">> -> $\n;
        <<"space">> -> $ ;
  