1+ module Test.ExampleRace where
2+
3+ import Prelude
4+
5+ import Control.Monad.State (get , modify , put )
6+ import Data.Array (replicate )
7+ import Data.Foldable (sequence_ )
8+ import Data.Generic.Rep (class Generic )
9+ import Data.Maybe (Maybe , maybe )
10+ import Data.Show.Generic (genericShow )
11+ import Effect (Effect )
12+ import Effect.Aff (Aff , Milliseconds (..), delay )
13+ import Effect.Aff as Aff
14+ import Effect.Aff.Class (liftAff )
15+ import Effect.Class.Console (log , logShow )
16+ import Effect.Exception (throw )
17+ import Marionette.Controllers.Monadic (MarionetteT , sendMsg )
18+ import Marionette.Controllers.Monadic as Monadic
19+ import Marionette.ReactBasic (useMarionette )
20+ import React.Basic.DOM (text )
21+ import React.Basic.DOM.Client (createRoot , renderRoot )
22+ import React.Basic.DOM.Simplified.Generated as R
23+ import React.Basic.Events (handler_ )
24+ import React.Basic.Hooks (Component , component , (/\))
25+ import React.Basic.Hooks as React
26+ import Web.DOM (Element )
27+ import Web.DOM.NonElementParentNode (getElementById )
28+ import Web.HTML (window )
29+ import Web.HTML.HTMLDocument (toNonElementParentNode )
30+ import Web.HTML.Window (document )
31+
32+ type State = Int
33+
34+ data Msg = Tick | User
35+
36+ control :: Msg -> MarionetteT Msg State Aff Unit
37+ control = case _ of
38+ Tick -> do
39+ log " start"
40+ ( get >>= \x -> do
41+ liftAff $ delay (Milliseconds 1.0 )
42+ log $ show x
43+ )
44+ # replicate 10000
45+ # sequence_
46+
47+ User -> put 100
48+
49+ mkApp :: Component { }
50+ mkApp = component " App" \_ -> React .do
51+ state /\ act <- useMarionette
52+ { initialState: 0
53+ , controller: Monadic .mkController control
54+ }
55+
56+ pure $ R .div {}
57+ [ R .div {}
58+ [ text $ show state
59+ ]
60+ , R .button { onClick: handler_ $ act Tick }
61+ [ text " tick"
62+ ]
63+ , R .button { onClick: handler_ $ act User }
64+ [ text " user"
65+ ]
66+ ]
67+
68+ main :: Effect Unit
69+ main = do
70+ elem <- elemById " root"
71+ >>= maybe (throw " Could not find container element" ) pure
72+
73+ reactRoot <- createRoot elem
74+ app <- mkApp
75+ renderRoot reactRoot (app {})
76+
77+ elemById :: String -> Effect (Maybe Element )
78+ elemById id = do
79+ doc <- document =<< window
80+ getElementById id $ toNonElementParentNode doc
0 commit comments