anchor.diff:      {keep_state_and_data, [{reply, gen_statem:from(), {error, {unexpected, atom()}}}]} |
       {keep_state, statedata(), [{reply, gen_statem:from(), list()}]} |
       {keep_state, statedata(), [{timeout, timeout(), get_work}]} |
  +    stop |
       {next_state, atom(), statedata()}.
   receive_data({call, From}, Event, StateData) ->
       enqueue_work_or_stop(receive_data, Event, From, StateData);
  +receive_data(cast, shutdown, _StateData) ->
  +    stop;
   receive_data(cast, {'DOWN', _, _, _, _Reason}, _StateData) ->
       error(incomplete);
   receive_data(cast, {gun_data, _Pid, StreamRef, nofin, Data},
  
positive.code:     {keep_state_and_data, [{reply, gen_statem:from(), {error, {unexpected, atom()}}}]} |
      {keep_state, statedata(), [{reply, gen_statem:from(), list()}]} |
      {keep_state, statedata(), [{timeout, timeout(), get_work}]} |
      {next_state, atom(), statedata(), [{timeout, 0, 0}]} |
      {next_state, atom(), statedata()}.
  receive_chunk({call, From}, Event, StateData) ->
      enqueue_work_or_stop(receive_chunk, Event, From, StateData);
  receive_chunk(cast, {'DOWN', _, _, _, _Reason}, _StateData) ->
      error(incomplete);
  receive_chunk(cast, {gun_data, _Pid, StreamRef, IsFin, Data}, StateData) ->
      NewStateData = manage_chunk(IsFin, StreamRef, Data, StateData),
      case IsFin of
  
negative.code:     {next_state, wait_response, StateData, [{reply, From, ok}]};
  wait_response({call, From}, Event, StateData) ->
      enqueue_work_or_stop(wait_response, Event, From, StateData);
  wait_response(cast, shutdown, _StateData) ->
      stop;
  wait_response(cast, {'DOWN', _, _, _, Reason}, _StateData) ->
      exit(Reason);
  wait_response(cast, {gun_response, _Pid, _StreamRef, fin, StatusCode, Headers},
  