Thanks a lot for the detailed answer!!! I clearly wasn't aware of the 
effect manager. I would read more about it.

Thanks!

On Tuesday, November 15, 2016 at 6:20:27 PM UTC-3, OvermindDL1 wrote:
>
> Comments i
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote:
>>
>> Hi everybody! I've been reading the docs and following Elm every now and 
>> then.  I did some toy application to learn the language and the 
>> architecture. I am working on a native iOS application so using Elm in my 
>> day job won't happen (for now). The main reason I want to learn Elm (apart 
>> from it being awesome!) is that I want to apply Elm's architecture to iOS 
>> with Swift (yeah a lot of people is doing the same thing). There are quite 
>> a few libraries that try to bring Elm's architecture to Swift but I don't 
>> want to use them. I want to implement something myself because that way I 
>> will be able to understand it better. 
>>
>> The reason I am writing is that I want to better understand how 
>> subscriptions work internally. Please correct me if I am wrong. My 
>> understanding of how subscription works is that they provide a mechanism to 
>> "hook" to a stream of infinite events. Those events get mapped to your own 
>> application message by virtue of the message constructor function that is 
>> passed when creating a new subscription. As far as I can tell the only way 
>> of creating subscription is by a model update. Every time the model gets 
>> updated, Elm's runtime calls the subscription function (passed to the init 
>> function when you bootstrap your app). This gives us the change to create a 
>> new subscription based of the current state. Am I correct? 
>>
>>    - Is there any other way of creating subscriptions? 
>>    - What happens when the process of starting a subscription needs to 
>>    perform a expensive side-effect? 
>>    - What is the Elm way of doing this?
>>
>> No other way of creating subscriptions.
> The subscription itself should be fairly minimal, the effect manager 
> handling the subscription setup and teradown should be doing all the costly 
> stuff 'out-of-band' of your main app.
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>> Lets say that I have an application that connects to an external device 
>> and after connecting with this device it wants to start listening to a 
>> stream of data that this device reports every one second. Lets imagine this 
>> device is thermometer that advertises the room's temperature. I want to 
>> have an app that prints the average temperature since a connection with 
>> thermometer was established. We can omit how we connect with thermometer 
>> for now
>>
>
>> type alias Model = 
>> { thermometer: Maybe Thermometer
>> , temperatureSamples: List Float
>> }
>>
>>
>> type Msg 
>>   = ConnectedThermometer Thermometer
>>   | TemperatureSample Float
>>
>>
>> update : Msg -> Model -> (Model, Cmd Msg) 
>> update msg model =
>>   case msg of
>>     ConnectedThermometer thermometer ->
>>       ({ model | thermometer = thermometer }, Cmd.none)
>>
>>
>>     TemperatureSample temperature ->
>>       ({ model | temperatureSamples = temperature :: model.
>> temperatureSamples}, Cmd.none)
>>
>> view : Model -> Html Msg
>> view model = 
>>   let
>>     averageTemperature = (List.sum model.temperatureSamples) / List.length 
>> model.temperatureSamples
>>   in
>>     Html.text (toString averageTemperature)
>>
>>
>> subscriptions : Model -> Sub Msg
>> subscriptions model =
>>   model.thermometer
>>     |> map Thermometer.temperature TemperatureSample
>>     |> withDefault Sub.none
>>
>>
>> -- Inside the Thermometer module
>> temperature : (Float -> Msg) -> Thermometer -> Sub Msg
>> temperature msgConstructor thermometer = ...
>>
>>
>> *I am assuming there is a function in the Thermometer that knows how to 
>> create subscription for a given connected thermometer. I am also assuming 
>> that this MUST be implemented in Javascript and that all needed 
>> side-effects in order to create the subscription are performed on the JS 
>> side.*
>>
>
> Nah, subscription can be managed within Elm by an effect manager (though 
> it tends to eventually go out to a javascript effect manager, like via HTTP 
> requests or whatever).
>
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>> If my assumptions are correct then my main concern is that for every 
>> state update this "expensive" side effects that could be performed on the 
>> JS side by creating a new subscription are executed for every model update. 
>> If that is the case then I have the following questions
>>
>
> A subscription is just that, a subscription, saying that you 'want to 
> listen to messages from a given effect manager'.  The remote effect manager 
> could even be doing stuff even when nothing is subscribed, a subscription 
> is just that the main app wants to listen to messages from that effect 
> manager.  Subscriptions should change only based on your state.  Basically 
> it works kind of like this:
>
> 1. You have a subscription that appears when something on your model is, 
> say, True.
> 2. The system sees that a new subscription has appeared compared to the 
> last check, so it calls into the effect manager (passing it a 
> 'registration' message basically), and the effect manager can do whatever 
> it wants, from storing it, ignoring it, whatever.
> 3. As the effect manager does stuff (receives something over a http 
> request, gets an interval call from the javascript setInterval, whatever), 
> it calls the 'router' to send a message back to the main application, which 
> the application handles via the subscription callback.
> 4. When the subscription is no longer registered in the main app the 
> effect manager gets a notification of that via another message to it.
>
> Basically for a given thermometer thing, the setup should generally either 
> be a task or an effect manager itself, depending on what and how much it 
> does.
>
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote:
>
>>
>>    - Is the responsibility of the JS code that creates the subscriptions 
>>    to keep track of the created subscriptions and avoid creating a new one 
>> if 
>>    a previous subscription to the same thermometer has already been created?
>>
>> Nope that is the job of the effect manager that is registered too (which 
> is sometimes but not always backed by JS code).
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>>
>>    - How would you terminate a subscription?
>>
>> Just quit registering to it, the effect manager backing it will tell the 
> effect manager that it is no longer interested in messages.
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>>
>>    - What happens if the process of establishing a subscription could 
>>    fail? 
>>
>> You could do that via a Task, get a valid or invalid connection (then 
> pass the connection to a subscription to listen to updates from it), or 
> that could be handled by the effect manager itself too, it makes a 
> connection when a subscription starts and so forth, it can send a failure 
> message (Result or some custom union type) if it fails for example.
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>>
>>    - What is the best way to handle that? 
>>
>> See above.
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>>
>>    - Do I need to execute a command to perform the side effect (which 
>>    could possible fail) that would allow to create a subscription and if and 
>>    only if this command is successfully executed then try to create a 
>>    subscription?
>>
>> Only if you want, but honestly I'd put that job in the effect manager 
> itself...
>
> On Tuesday, November 15, 2016 at 2:02:10 PM UTC-7, Guido Marucci Blas 
> wrote: 
>
>> Sorry for the big bulk of text and thanks in advance!
>>
>
> And do note, I use Elm in a large project, but I do not do dev work on elm 
> itself, my knowledge is no doubt incomplete but I have decently implemented 
> the Elm API (subscriptions and all) in other languages (of which it works 
> wonderfully in) so I hope my knowledge is fairly accurate.  ;-) 
>

-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to