anchor.diff:  
   -on_load(init/0).
   
  +-opaque state() :: any().
  +-type row() :: tuple().
  +-type input() :: eof | (Bin :: binary()).
  +
  +-type reader_state() :: any().
  +-type reader_fun(RS) :: fun((State0 :: RS) -> State :: RS).
  +
  +-type callback_state() :: any().
  +-type callback_message() :: {eof | lines, [row()]}.
  +-type callback_fun(CS) :: fun((Message :: callback_message(), State0 :: CS) -> State :: CS).
  +
   %%====================================================================
   %% API functions
   %%====================================================================
  
positive.code: default_block_size() ->
      ?BLOCK_SIZE.
  
  parse(Bin) ->
      {ok, Acc, S} = parse_raw(Bin, default_state(), []),
      {ok, Ls, _} = parse_raw(eof, S, Acc),
      lists:reverse(Ls).
  
  parse(Bin, State) ->
      parse_raw(Bin, State, []).
  
  parse_stream(ReaderFun, ReaderState, CallbackFun, CallbackState) ->
      parse_stream(ReaderFun, ReaderState, CallbackFun, CallbackState,
                   default_state()).
  
  parse_stream(ReaderFun, ReaderState, CallbackFun, CallbackState, State) ->
      parse_stream_(ReaderFun, ReaderState, CallbackFun, CallbackState,
                   State).
  
  parser_init(Delim, Quote) ->
      erlang:nif_error(not_loaded, [Delim, Quote]).
  
  file_reader() ->
      fun(FS) ->
              case file:read(FS, ?BLOCK_SIZE) of
  
negative.code: default_state() ->
      parser_init($,, $").
  
  -spec(parse_stream_(RF :: reader_fun(RST), RS0 :: RST, CF :: callback_fun(CST), CS0 :: CST, State0 :: state()) -> {RS :: RST, CS :: CST, State :: state()}).
  parse_stream_(RF, RS, CF, CS, State) ->
      case RF(RS) of
          {eof, RS2} ->
  