-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMVarDom.hs
62 lines (47 loc) · 1.52 KB
/
MVarDom.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
{-# LANGUAGE ExtendedDefaultRules, OverloadedStrings #-}
module MVarDom where
import Control.Monad.Trans (MonadIO, liftIO)
import Control.Concurrent.MVar
import Data.Tree
import Data.Text
data Tag = Div_ | Span_ | CData_ | Custom_ Text deriving Show
data MVarDOMAttr = MVA (Text, Text) deriving Show
data MVarDOM = MVD Tag (MVar [MVarDOMAttr]) [MVar MVarDOM]
type DOM = MVar MVarDOM
data PureDOM = PureDOM (Tag, [MVarDOMAttr]) [PureDOM] deriving Show
printDOM :: DOM -> IO ()
printDOM dom = do
MVD t (mattrs) cs <- takeMVar dom
attrs <- takeMVar mattrs
print (t,attrs)
mapM_ (\c -> putStr " " >> printDOM c) cs
pure2mvar :: MonadIO m => PureDOM -> m DOM
pure2mvar (PureDOM (tag,attrs) children) = do
mcs <- mapM pure2mvar children
mattrs <- liftIO $ newMVar attrs
liftIO $ newMVar (MVD tag mattrs mcs)
think
:: IO
(MVar
(String,
[(String, String)],
[MVar (String, [(String, String)], [MVar (String, String)])]))
think = do
msg1 <- newMVar ("cdata", "thing1")
msg2 <- newMVar ("cdata", "thing2")
thing1 <- newMVar ("span", [("id","1")], [msg1])
thing2 <- newMVar ("span", [("id","2")], [msg2])
let children = [thing1, thing2]
root <- newEmptyMVar
putMVar root ("div", [("id","0")], children)
return root
-- ex1 :: MonadIO m => m DOM
ex1 :: IO DOM
ex1 = do
attrs <- newMVar []
newMVar (MVD Div_ attrs [])
pureEx :: PureDOM
pureEx =
PureDOM (Div_, [MVA ("id","1")]) [PureDOM (Div_, [MVA ("id","2")]) []]
mex :: MonadIO m => m DOM
mex = liftIO $ pure2mvar pureEx