Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions moon.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@
"name": "respo/app",
"version": "0.1.0",
"deps": {
"tiye/respo": "0.0.35",
"tiye/dom-ffi": "0.0.9"
"tiye/respo": "0.1.0",
"tiye/dom-ffi": "0.2.0",
"tiye/respo_css": "0.1.2"
},
"readme": "README.md",
"repository": "",
"license": "Apache-2.0",
"keywords": [],
"description": "",
"source": "src"
"source": "src",
"preferred-target": "js"
}
19 changes: 11 additions & 8 deletions src/main/counter.mbt
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
///|
typealias @respo_node.(RespoEvent, RespoNode, DispatchFn, RespoCommonError)

///|
fnalias @respo_node.text_node
using @respo_node {
text_node,
type RespoEvent,
type RespoNode,
type DispatchFn,
type RespoCommonError
}

///|
struct MainState {
Expand All @@ -12,14 +15,14 @@ struct MainState {
///|
fn comp_counter(
states : @respo.RespoStatesTree,
global_counted : Int
global_counted : Int,
) -> RespoNode[ActionOp] {
let cursor = states.path()
let state = (states.cast_branch() : MainState)
let counted = state.counted
let on_inc = fn(
e : RespoEvent,
dispatch : DispatchFn[ActionOp]
dispatch : DispatchFn[ActionOp],
) -> Unit raise RespoCommonError {
@dom_ffi.warn_log("inc click: \{e}")
if e is Click(original_event~, ..) {
Expand All @@ -31,7 +34,7 @@ fn comp_counter(
}
let on_dec = fn(
e : RespoEvent,
dispatch : DispatchFn[ActionOp]
dispatch : DispatchFn[ActionOp],
) -> Unit raise RespoCommonError {
@dom_ffi.warn_log("dec click: \{e}")
dispatch.run(Decrement)
Expand All @@ -40,7 +43,7 @@ fn comp_counter(
}
let on_inc_twice = fn(
e : RespoEvent,
dispatch : DispatchFn[ActionOp]
dispatch : DispatchFn[ActionOp],
) -> Unit raise RespoCommonError {
@dom_ffi.warn_log("twice click: \{e}")
dispatch.run(IncTwice)
Expand Down
44 changes: 24 additions & 20 deletions src/main/main.mbt
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
///|
fnalias @respo_node.(div, span, button, respo_style)
using @respo_node {div, span, button}

///|
using @css {respo_style}

///|
let app_store_key : String = "mbt-workflow"

///|
fn view(
store : Store
store : Store,
) -> @respo_node.RespoNode[ActionOp] raise @respo_node.RespoCommonError {
if false {
raise @respo_node.RespoCommonError("TODO")
Expand All @@ -21,23 +24,24 @@ fn view(
///|
fn main {
let window = @dom_ffi.window()
let mount_target = window
.document()
.query_selector(".app")
.reinterpret_as_node()
let app : @respo.RespoApp[Store] = {
store: Ref::new(@respo.try_load_storage(app_store_key)),
mount_target,
storage_key: app_store_key,
if window.document().query_selector(".app") is Some(mount_target) {
let mount_target = mount_target.reinterpret_as_node()
let app : @respo.RespoApp[Store] = {
store: Ref::new(@respo.try_load_storage(app_store_key)),
mount_target,
storage_key: app_store_key,
}
app.backup_model_beforeunload()
// @dom_ffi.log("store: " + app.store.val.to_json().stringify(indent=2))
app.render_loop(fn() { view(app.store.val) }, fn(op) {
@dom_ffi.log("Action: \{op}")
app.store.val.update(op)
})
let dev_mode = @dom_ffi.new_url_search_params(window.location().search()).get(
"mode",
)
@dom_ffi.log("dev mode: \{dev_mode}")
} else {
@dom_ffi.log("No mount target found")
}
app.backup_model_beforeunload()
// @dom_ffi.log("store: " + app.store.val.to_json().stringify(indent=2))
app.render_loop(fn() { view(app.store.val) }, fn(op) {
@dom_ffi.log("Action: \{op}")
app.store.val.update(op)
})
let dev_mode = @dom_ffi.new_url_search_params(window.location().search()).get(
"mode",
)
@dom_ffi.log("dev mode: \{dev_mode}")
}
7 changes: 4 additions & 3 deletions src/main/moon.pkg.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
"is-main": true,
"import": [
{
"path": "tiye/respo/lib",
"path": "tiye/respo",
"alias": "respo"
},
{
"path": "tiye/respo/lib/node",
"path": "tiye/respo/node",
"alias": "respo_node"
},
{ "path": "tiye/dom-ffi/lib", "alias": "dom_ffi" }
{ "path": "tiye/dom-ffi", "alias": "dom_ffi" },
{ "path": "tiye/respo_css", "alias": "css" }
]
}
26 changes: 21 additions & 5 deletions src/main/store.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,37 @@ struct Task {

///|
enum ActionOp {
Noop
StatesChange(@respo.RespoUpdateState)
Increment
Decrement
IncTwice
}

///|
impl @respo_node.RespoAction for ActionOp with build_states_action(cursor, a) {
ActionOp::StatesChange({ cursor, data: a.map(ToJson::to_json) })
pub impl Default for ActionOp with default() -> ActionOp {
Noop
}

///|
impl @respo_node.RespoAction for ActionOp with build_states_action(cursor, a, j) {
StatesChange({
cursor,
data: if a is Some(a) {
Some(@dom_ffi.js_obscure_to_v(a))
} else {
None
},
backup: j,
})
}

///|
impl Show for ActionOp with output(self, logger) -> Unit {
let s = match self {
StatesChange(states) =>
"StatesChange(\{states.cursor} \{states.data.to_json()})"
Noop => "Noop"
StatesChange(state) =>
"StatesChange(\{state.cursor} \{state.backup.to_json()})"
// Intent(_intent) => "Intent(...)"
Increment => "Increment"
Decrement => "Decrement"
Expand All @@ -49,7 +64,8 @@ fn get_states(self : Store) -> @respo.RespoStatesTree {
self.states
}

///| TODO mutation might break memoization in future
///|
/// TODO mutation might break memoization in future
fn update(self : Store, op : ActionOp) -> Unit {
match op {
Increment => self.counted += 1
Expand Down