/
VirtualStylesheet.purs
51 lines (42 loc) · 1.37 KB
/
VirtualStylesheet.purs
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
module Stylesheet.Types.VirtualStylesheet where
import Prelude (class Monoid, class Semigroup, mempty, (<>))
import Stylesheet.Types.Primitives
import Stylesheet.Internal.ProcessStyles (getClasses)
import Data.HashMap as HM
import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol)
-- our virtual stylesheet is our idea of the stylesheet
-- we add to this
-- and then it is differed so the real one reflects it
data VirtualStylesheet (p :: Symbol)
= MkVirtualStylesheet (HM.HashMap (Array CSSSelector) InsertMediaRule)
instance semigroupVirtualStylesheet :: Semigroup (VirtualStylesheet p) where
append (MkVirtualStylesheet a) (MkVirtualStylesheet b)
= MkVirtualStylesheet (a <> b)
instance monoidVirtualStylesheet :: Monoid (VirtualStylesheet p) where
mempty = MkVirtualStylesheet mempty
fromItem
:: forall p
. InsertMediaRule
-> VirtualStylesheet p
fromItem rule
= MkVirtualStylesheet (HM.singleton key rule)
where
key
= getClasses rule
-- | Takes old one and new one and return the changes
diff
:: forall p
. VirtualStylesheet p
-> VirtualStylesheet p
-> Array (InsertMediaRule)
diff (MkVirtualStylesheet new) (MkVirtualStylesheet old)
= HM.values (HM.difference new old)
---
getStylesheetId
:: forall s
. IsSymbol s
=> VirtualStylesheet s
-> StylesheetId
getStylesheetId _
= StylesheetId (reflectSymbol (SProxy :: SProxy s))
---