[erlang-questions] "calling" a gen_fsm

Vance Shipley vances@REDACTED
Wed Sep 23 06:30:43 CEST 2015

On Wed, Sep 23, 2015 at 12:32 AM, Roger Lipscombe
<roger@REDACTED> wrote:
> Both Theepan and Vance are correct in that this is a useful way to
> build this kind of thing. In fact, there's a good example (using a
> gen_server, rather than a gen_fsm) here:
> https://erlangcentral.org/wiki/index.php?title=Building_Non_Blocking_Erlang_apps

What I don't like about that example is that it's not purely
functional.  I would prefer:

     handle_call({request, Tr_id, Req}, From, #state{tr = Tr, socket =
Socket} = State) ->
          Data = encode(Tr_id, Req),
          gen_tcp:send(Socket, Data),
          NewState = State#state{tr = dict:store(Tr_id, From, Tr)},
          {noreply, NewState}.

     handle_info({tcp, _Socket, Data}, #state{tr = Tr} = State) ->
          {Tr_id, Result} = decode(Data),
          From = dict:fetch(Tr_id, Tr),
          gen_server:reply(From, Result),
          NewState = State#state{tr = dict:erase(From, Tr)},
          {noreply, NewState}.


More information about the erlang-questions mailing list