There is not much documentation on it on purpose. ^.^
Best way to learn it is to read how it is implemented in the core
libraries. :-)
As a comparison, if you are try to implement TEA in Swift, I managed to
make subscriptions in mine via startup/shutdown callbacks and a back-end
differ, quite easy to make then. :-)
On Tuesday, November 15, 2016 at 2:35:20 PM UTC-7, Guido Marucci Blas wrote:
>
> 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.