Packages
lustre
2.0.1
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
src/lustre/cmd.gleam
// IMPORTS ---------------------------------------------------------------------
import gleam/list
// TYPES -----------------------------------------------------------------------
/// A `Cmd` represents some side effect we want the Lustre runtime to perform.
/// It is parameterised by our app's `action` type because some effects need to
/// get information back into your program.
///
pub opaque type Cmd(action) {
Cmd(fn(fn(action) -> Nil) -> Nil, Cmd(action))
None
}
// CONSTRUCTORS ----------------------------------------------------------------
/// Create a `Cmd` from some custom side effect. This is mostly useful for
/// package authors, or for integrating other libraries into your Lustre app.
///
/// We pass in a function that recieves a `dispatch` callback that can be used
/// to send messages to the Lustre runtime. We could, for example, create a `tick`
/// command that uses the `setTimeout` JavaScript API to send a message to the
/// runtime every second:
///
/// ```gleam
/// import lustre/cmd.{Cmd}
///
/// external fn set_interval(callback: fn() -> any, interval: Int) =
/// "" "window.setInterval"
///
/// pub fn every_second(msg: msg) -> Cmd(msg) {
/// use dispatch <- cmd.from
///
/// set_interval(fn() { dispatch(msg) }, 1000)
/// }
/// ```
///
pub fn from(cmd: fn(fn(action) -> Nil) -> Nil) -> Cmd(action) {
Cmd(cmd, None)
}
/// Typically our app's `update` function needs to return a tuple of
/// `#(model, Cmd(action))`. When we don't need to perform any side effects we
/// can just return `none()`!
///
pub fn none() -> Cmd(action) {
None
}
// MANIPULATIONS ---------------------------------------------------------------
///
///
pub fn batch(cmds: List(Cmd(action))) -> Cmd(action) {
cmds
|> list.flat_map(to_list)
|> list.fold_right(None, fn(rest, cmd) { Cmd(cmd, rest) })
}
pub fn map(cmd: Cmd(a), f: fn(a) -> b) -> Cmd(b) {
case cmd {
Cmd(cmd, next) ->
Cmd(fn(dispatch) { cmd(fn(a) { dispatch(f(a)) }) }, map(next, f))
None -> None
}
}
// CONVERSIONS -----------------------------------------------------------------
pub fn to_list(cmd: Cmd(action)) -> List(fn(fn(action) -> Nil) -> Nil) {
case cmd {
Cmd(cmd, next) -> [cmd, ..to_list(next)]
None -> []
}
}