aboutsummaryrefslogtreecommitdiff
path: root/src/lustre.gleam
diff options
context:
space:
mode:
authorHayleigh Thompson <me@hayleigh.dev>2023-09-19 23:40:03 +0100
committerHayleigh Thompson <me@hayleigh.dev>2023-09-19 23:40:03 +0100
commit92e8596b78982885803994b50c6b35f73f7a403e (patch)
tree13428243987317da540495215ed4d9e3938fb5cb /src/lustre.gleam
parent985a9b0aa469cbe94fb95c433c97e2b321014341 (diff)
downloadlustre-92e8596b78982885803994b50c6b35f73f7a403e.tar.gz
lustre-92e8596b78982885803994b50c6b35f73f7a403e.zip
:recycle: So long monorepo.
Diffstat (limited to 'src/lustre.gleam')
-rw-r--r--src/lustre.gleam97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/lustre.gleam b/src/lustre.gleam
new file mode 100644
index 0000000..4f8249a
--- /dev/null
+++ b/src/lustre.gleam
@@ -0,0 +1,97 @@
+//// To read the full documentation for this module, please visit
+//// [https://pkg.hayleigh.dev/lustre/api/lustre](https://pkg.hayleigh.dev/lustre/api/lustre)
+
+// IMPORTS ---------------------------------------------------------------------
+
+import gleam/dynamic.{Decoder}
+import gleam/map.{Map}
+import lustre/effect.{Effect}
+import lustre/element.{Element}
+
+// TYPES -----------------------------------------------------------------------
+
+///
+pub type App(flags, model, msg)
+
+pub type Error {
+ AppAlreadyStarted
+ AppNotYetStarted
+ BadComponentName
+ ComponentAlreadyRegistered
+ ElementNotFound
+ NotABrowser
+}
+
+// CONSTRUCTORS ----------------------------------------------------------------
+
+@target(javascript)
+///
+pub fn element(element: Element(msg)) -> App(Nil, Nil, msg) {
+ let init = fn(_) { #(Nil, effect.none()) }
+ let update = fn(_, _) { #(Nil, effect.none()) }
+ let view = fn(_) { element }
+
+ application(init, update, view)
+}
+
+@target(javascript)
+///
+pub fn simple(
+ init: fn(flags) -> model,
+ update: fn(model, msg) -> model,
+ view: fn(model) -> Element(msg),
+) -> App(flags, model, msg) {
+ let init = fn(flags) { #(init(flags), effect.none()) }
+ let update = fn(model, msg) { #(update(model, msg), effect.none()) }
+
+ application(init, update, view)
+}
+
+@target(javascript)
+///
+@external(javascript, "./lustre.ffi.mjs", "setup")
+pub fn application(
+ init: fn(flags) -> #(model, Effect(msg)),
+ update: fn(model, msg) -> #(model, Effect(msg)),
+ view: fn(model) -> Element(msg),
+) -> App(flags, model, msg)
+
+@target(javascript)
+@external(javascript, "./lustre.ffi.mjs", "setup_component")
+pub fn component(
+ name: String,
+ init: fn() -> #(model, Effect(msg)),
+ update: fn(model, msg) -> #(model, Effect(msg)),
+ view: fn(model) -> Element(msg),
+ on_attribute_change: Map(String, Decoder(msg)),
+) -> Result(Nil, Error)
+
+// EFFECTS ---------------------------------------------------------------------
+
+@target(javascript)
+///
+@external(javascript, "./lustre.ffi.mjs", "start")
+pub fn start(
+ app: App(flags, model, msg),
+ selector: String,
+ flags: flags,
+) -> Result(fn(msg) -> Nil, Error)
+
+@target(javascript)
+///
+@external(javascript, "./lustre.ffi.mjs", "destroy")
+pub fn destroy(app: App(flags, model, msg)) -> Result(Nil, Error)
+
+// UTILS -----------------------------------------------------------------------
+
+///
+@external(javascript, "./lustre.ffi.mjs", "is_browser")
+pub fn is_browser() -> Bool {
+ False
+}
+
+///
+@external(javascript, "./lustre.ffi.mjs", "is_registered")
+pub fn is_registered(_name: String) -> Bool {
+ False
+}