Bindings for mounting and interacting with Elm applications in Reason.
Writing web applications in Elm is nice. It's type system and enforced architecture
are just a couple of the really cool things that it offers. The Elm ecosystem is
pretty small compared to the Javascript(JS) ecosystem, and this is a draw back
when coming from the world of JS. Interop with JS is possible, but it requires
writing regular JS code, which has none of Elm's safety. This is where Reason
enters the picture. Reason can communicate more direclty with JS with much more
type safety than vanilla JS. The possibility of writing an Elm app and handling
JS interop with Reason is pretty powerful. Having access to the entire JS
ecosytem in a (more) typesafe way is pretty exciting, so bs-elm
was created.
Install
yarn add bs-elm
npm install --save bs-elm
bs-elm
as a dependency in bsconfig.json
{
...
"bs-dependencies": ["bs-elm"]
}
Elm
module in reasonmodule R = Belt.Result;
type ports = {
infoForReason: Elm.elmToReasonPort(string),
infoForElm: Elm.reasonToElmPort(string),
};
[@bs.val] external elmProgram: Elm.elmProgramWithPorts(ports) = "Elm";
/* Or if using a bundler.
[@bs.module]
external elmProgram : Elm.elmProgramWithPorts(ports) = "path/to/App.elm";
*/
type flags = {...};
let resultRuntime =
Elm.mount(
~flags={..}, /* Optional, defaults to Nothing */
~moduleName="Other.Main", /* Optional, defaults to "Main" */
elmProgram,
);
switch (resultRuntime) {
| R.Ok(runtime) =>
runtime.ports.infoForReason.subscribe(info =>
runtime.ports.infoForElm.send("You pressed " ++ info)
)
| R.Error(message) => Js.log(message)
};
Checkout the example/
!
Checkout this repo using webpack!
Checkout the rei file for documenation.
If you have any suggestions or run into any bugs, please open an issue!
v3.0.0
->
v2.0.0
->
v1.0.2
->
v1.0.1
->
.bs.js
instead of .js
v1.0.0
->
bs-elm
ReasonElm
to Elm
elmOutPort
-> portToElm
and elmInPort
-> portFromElm