This repository has been archived by the owner on Aug 23, 2018. It is now read-only.
Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
core/src/Platform.elm
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
120 lines (82 sloc)
2.99 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |