@@ -1,33 +1,25 @@
1−module Plum (Plum, run, currentOrigin) where
1+module Plum (Plum, run) where
3import Prelude
3import Prelude
5import Data.Array as Array
5import Data.Array as Array
6import Data.Maybe (Maybe(..))
6import Data.Maybe (Maybe(..))
9import Effect (Effect)
7import Effect (Effect)
10−import Effect.Aff (Aff, launchAff_)
11−import Effect.Class (liftEffect)
12import Effect.Console (log)
8import Effect.Console (log)
13−import Effect.Exception (throw)
14import Effect.Ref as Ref
9import Effect.Ref as Ref
15import Foreign.Object as Object
10import Foreign.Object as Object
16import Literals.Undefined (undefined)
11import Literals.Undefined (undefined)
17import Plum.View (GenericUI(..), UI, grow)
12import Plum.View (GenericUI(..), UI, grow)
18import Snabbdom as Snabbdom
13import Snabbdom as Snabbdom
19−import Unsafe.Coerce (unsafeCoerce)
20import Untagged.Union (asOneOf)
14import Untagged.Union (asOneOf)
21import Web.DOM.NonElementParentNode (getElementById) as Web
15import Web.DOM.NonElementParentNode (getElementById) as Web
22import Web.HTML (window) as Web
16import Web.HTML (window) as Web
23−import Web.HTML.Event.EventTypes (invalid)
24import Web.HTML.HTMLDocument (toNonElementParentNode) as Web
17import Web.HTML.HTMLDocument (toNonElementParentNode) as Web
25−import Web.HTML.Location as Location
26−import Web.HTML.Window (document, location) as Web
18+import Web.HTML.Window (document) as Web
28type Plum msg model =
20type Plum msg model =
29− { init :: (Aff msg -> Effect Unit) -> Effect model
21+ { init :: Effect model
30− , update :: (Aff msg -> Effect Unit) -> msg -> model -> Effect model
22+ , update :: msg -> model -> Effect model
31 , view :: model -> UI msg Unit
23 , view :: model -> UI msg Unit
@@ -36,36 +28,25 @@ run id plum = do
36 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
28 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
37 Just element -> do
29 Just element -> do
38 let node = Snabbdom.toVNode element
30 let node = Snabbdom.toVNode element
39− modelRef <- Ref.new { model: unsafeCoerce undefined, lastNode: node }
40 patch <- Snabbdom.init
31 patch <- Snabbdom.init
32+ initModel <- plum.init
33+ modelRef <- Ref.new { model: initModel, lastNode: node }
45− { model: m, lastNode } <- Ref.read modelRef
51− liftEffect $ fire msg'
58− newNode <- patch lastNode node'
59− Ref.write { model: m_, lastNode: newNode } modelRef
62 view model = do
35 view model = do
63 let UI { children } _ = plum.view model
36 let UI { children } _ = plum.view model
64 case Array.uncons children of
37 case Array.uncons children of
65 Just { head: child } -> do
38 Just { head: child } -> do
67 { node, style } = grow
40 { 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
71 Snabbdom.h "div"
52 Snabbdom.h "div"
@@ -94,15 +75,6 @@ run id plum = do
96 (asOneOf undefined)
77 (asOneOf undefined)
97− initModel <- plum.init
102− liftEffect $ fire msg'
106 newNode <- view initModel
78 newNode <- view initModel
107 newNode_ <- patch node newNode
79 newNode_ <- patch node newNode
108 log "patched"
80 log "patched"
@@ -112,10 +84,3 @@ run id plum = do
113outerStyle :: String
85outerStyle :: String
114outerStyle = "html,body{height:100%;padding:0;margin:0;}"
86outerStyle = "html,body{height:100%;padding:0;margin:0;}"
116−currentOrigin :: Effect URL
118− s <- Web.window >>= Web.location >>= Location.origin
119− case URL.fromString s of
120− Nothing -> throw "window.location.origin returned an invalid url"
121− Just url -> pure url