Le 23/05/2017 à 18:13, 'Rupert Smith' via Elm Discuss a écrit :
> On Tuesday, May 23, 2017 at 3:30:44 PM UTC+1, Christophe de Vienne wrote:
> 
>     It is what I did at first, but it has serious drawbacks. The biggest
>     was
>     that a subscription implies an update of the Nats state... so I had to
>     push the state to all the update functions and they had to sent it
>     back... Very messy.
> 
> 
> This use case can be catered for by using a correlation id, I think.
> Also, perhaps the word 'subscription' is getting overloaded here, you
> have the Elm Sub(scription), and the NATS protocol subscription, and the
> middleware subscription (listen), making this conversation a little
> difficult to nail down...
> 
> == Module Consuming the NATS Protocol
> 
> Elmq.sendString "subscribe" "nats0"
> Elmq.listen "nats0"
> 

Except that sending a command to initialize a subscription is not
something I want the final module to do. No more that having to send a
command to unsubscribe.

My current implementation allow the module consuming to simply do:

    Nats.subscribe "subject" tagger

Used this way elmq does not improve the situation.

> == The module implementing the NATS protocol
> 
> type Msg =
>     NewNatsSubscription String
>     | ...
> 
> Elmq.listenString "subscribe" (\channel -> NewNatsSubscription)
> Elm.send channelName ...
> 
> ==
> 
> So I sent a subscription request to Nats, and when Nats processed it, it
> sends back messages on the named channel. The channel name is used as a
> correlation id to link together the act of creating the subscription and
> the messages that then flow over that subscription.
> 
> I don't know the specific of NATS and whether it has named channels etc.
> but hopefully you get what I am on about?

I think I do, and it would work. But the resulting API is less natural
that what I achieved already without elmq (unless I am still missing
something of course).

For sending pure commands though (publish and... that's it I guess,
because request requires to handle a response, which elmq won't make
easy), elmq could make things better, as the update functions would
return only Cmd and not both a Cmd and a Nats.Cmd.Cmd as they have to do
right now.

That said once the boilerplate is in place, it is not that painful.

In the app I am building on top of elm-nats I even added a wrapper type
around Cmd and Nats.Cmd.Cmd:

   type MyCmd msg = PCmd (Cmd msg) | NCmd (Nats.Cmd.Cmd msg)

along with batch, map and none functions.

All the update functions returns (Model, MyCmd), and the top-level
update separates the Cmd from the Nats.Cmd.Cmd and converts the
Nats.Cmd.Cmd and Nats.Sub.Sub to Cmd with the Nats API (which updates
the nats state at the same time).

-- 
Christophe de Vienne

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to