@@ -5,12 +5,15 @@ import Prelude
5import Data.Array as Array
5import Data.Array as Array
6import Data.Maybe (Maybe(..))
6import Data.Maybe (Maybe(..))
7import Effect (Effect)
7import Effect (Effect)
8+import Effect.Aff (Aff, launchAff_)
9+import Effect.Class (liftEffect)
8import Effect.Console (log)
10import Effect.Console (log)
9import Effect.Ref as Ref
11import Effect.Ref as Ref
10import Foreign.Object as Object
12import Foreign.Object as Object
11import Literals.Undefined (undefined)
13import Literals.Undefined (undefined)
12import Plum.View (GenericUI(..), UI, grow)
14import Plum.View (GenericUI(..), UI, grow)
13import Snabbdom as Snabbdom
15import Snabbdom as Snabbdom
16+import Unsafe.Coerce (unsafeCoerce)
14import Untagged.Union (asOneOf)
17import Untagged.Union (asOneOf)
15import Web.DOM.NonElementParentNode (getElementById) as Web
18import Web.DOM.NonElementParentNode (getElementById) as Web
16import Web.HTML (window) as Web
19import Web.HTML (window) as Web
@@ -18,8 +21,8 @@ import Web.HTML.HTMLDocument (toNonElementParentNode) as Web
18import Web.HTML.Window (document) as Web
21import Web.HTML.Window (document) as Web
20type Plum msg model =
23type Plum msg model =
21− { init :: Effect model
24+ { init :: (Aff msg -> Effect Unit) -> Effect model
22− , update :: msg -> model -> Effect model
25+ , update :: (Aff msg -> Effect Unit) -> msg -> model -> Effect model
23 , view :: model -> UI msg Unit
26 , view :: model -> UI msg Unit
@@ -28,25 +31,36 @@ run id plum = do
28 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
31 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
29 Just element -> do
32 Just element -> do
30 let node = Snabbdom.toVNode element
33 let node = Snabbdom.toVNode element
34+ modelRef <- Ref.new { model: unsafeCoerce undefined, lastNode: node }
31 patch <- Snabbdom.init
35 patch <- Snabbdom.init
32− initModel <- plum.init
33− modelRef <- Ref.new { model: initModel, lastNode: node }
40+ { model: m, lastNode } <- Ref.read modelRef
46+ liftEffect $ fire msg'
53+ newNode <- patch lastNode node'
54+ Ref.write { model: m_, lastNode: newNode } modelRef
35 view model = do
57 view model = do
36 let UI { children } _ = plum.view model
58 let UI { children } _ = plum.view model
37 case Array.uncons children of
59 case Array.uncons children of
38 Just { head: child } -> do
60 Just { head: child } -> do
40 { node, style } = grow
62 { node, style } = grow
43− { model: m, lastNode } <- Ref.read modelRef
44− m_ <- plum.update msg m
46− newNode <- patch lastNode node
47− Ref.write { model: m_, lastNode: newNode } modelRef
52 Snabbdom.h "div"
66 Snabbdom.h "div"
@@ -75,6 +89,15 @@ run id plum = do
77 (asOneOf undefined)
91 (asOneOf undefined)
92+ initModel <- plum.init
97+ liftEffect $ fire msg'
78 newNode <- view initModel
101 newNode <- view initModel
79 newNode_ <- patch node newNode
102 newNode_ <- patch node newNode
80 log "patched"
103 log "patched"
@@ -84,3 +107,4 @@ run id plum = do
85outerStyle :: String
108outerStyle :: String
86outerStyle = "html,body{height:100%;padding:0;margin:0;}"
109outerStyle = "html,body{height:100%;padding:0;margin:0;}"