This repository has been archived by the owner. It is now read-only.
Permalink
Fetching contributors…
Cannot retrieve contributors at this time
121 lines (82 sloc) 2.99 KB
module Platform exposing
( Program, worker
, Task, ProcessId
, Router, sendToApp, sendToSelf
)
{-|
# Programs
@docs Program, worker
# Platform Internals
## Tasks and Processes
@docs Task, ProcessId
## Effect Manager Helpers
An extremely tiny portion of library authors should ever write effect managers.
Fundamentally, Elm needs maybe 10 of them total. I get that people are smart,
curious, etc. but that is not a substitute for a legitimate reason to make an
effect manager. Do you have an *organic need* this fills? Or are you just
curious? Public discussions of your explorations should be framed accordingly.
@docs Router, sendToApp, sendToSelf
-}
import Basics exposing (Never)
import Elm.Kernel.Platform
import Elm.Kernel.Scheduler
import Platform.Cmd exposing (Cmd)
import Platform.Sub exposing (Sub)
-- PROGRAMS
{-| A `Program` describes an Elm program! How does it react to input? Does it
show anything on screen? Etc.
-}
type Program flags model msg = Program
{-| Create a [headless][] program with no user interface.
This is great if you want to use Elm as the “brain” for something
else. For example, you could send messages out ports to modify the DOM, but do
all the complex logic in Elm.
[headless]: https://en.wikipedia.org/wiki/Headless_software
Initializing a headless program from JavaScript looks like this:
```javascript
var app = Elm.MyThing.worker();
```
If _do_ want to control the user interface in Elm, the [`Browser`][browser]
module has a few ways to create that kind of `Program` instead!
[headless]: https://en.wikipedia.org/wiki/Headless_software
[browser]: /packages/elm-lang/browser/latest/Browser
-}
worker
: { init : flags -> ( model, Cmd msg )
, update : msg -> model -> ( model, Cmd msg )
, subscriptions : model -> Sub msg
}
-> Program flags model msg
worker =
Elm.Kernel.Platform.worker
-- TASKS and PROCESSES
{-| Head over to the documentation for the [`Task`](Task) module for more
information on this. It is only defined here because it is a platform
primitive.
-}
type Task err ok = Task
{-| Head over to the documentation for the [`Process`](Process) module for
information on this. It is only defined here because it is a platform
primitive.
-}
type ProcessId = ProcessId
-- EFFECT MANAGER INTERNALS
{-| An effect manager has access to a “router” that routes messages between
the main app and your individual effect manager.
-}
type Router appMsg selfMsg =
Router
{-| Send the router a message for the main loop of your app. This message will
be handled by the overall `update` function, just like events from `Html`.
-}
sendToApp : Router msg a -> msg -> Task x ()
sendToApp =
Elm.Kernel.Platform.sendToApp
{-| Send the router a message for your effect manager. This message will
be routed to the `onSelfMsg` function, where you can update the state of your
effect manager as necessary.
As an example, the effect manager for web sockets
-}
sendToSelf : Router a msg -> msg -> Task x ()
sendToSelf =
Elm.Kernel.Platform.sendToSelf