0 | module CyBy.Draw.Internal.Role
3 | import Derive.Prelude
6 | %language ElabReflection
22 | %runElab derive "Role" [Show,Eq,Ord]
25 | Semigroup Role where
26 | R x <+> R y = R (x .|. y)
29 | Monoid Role where neutral = R 0
32 | None, Hover, Selected, Origin, New, Persistent, HoverNew, Highlight : Role
39 | Persistent = Hover <+> Selected
40 | HoverNew = Hover <+> New
44 | interface ModRole a where
45 | modRole : (Role -> Role) -> a -> a
48 | ModRole Role where modRole f = f
52 | setIf : ModRole a => Role -> Bool -> a -> a
53 | setIf r True = modRole (r <+>)
54 | setIf r False = modRole $
\(R y) => R (y `xor` (r.role .&. y))
58 | set : ModRole a => Role -> a -> a
59 | set r = r `setIf` True
63 | unset : ModRole a => Role -> a -> a
64 | unset r = r `setIf` False
68 | keep : ModRole a => Role -> a -> a
69 | keep (R x) = modRole $
\(R y) => R (x .&. y)
73 | clear : ModRole a => a -> a
74 | clear = modRole (const None)
79 | is : Cast a Role => Role -> a -> Bool
80 | is (R x) v = (x .&. role (cast v)) == x
88 | data SelectMode = Ignore | One | Many
95 | selectIfHovered : ModRole a => SelectMode -> a -> a
96 | selectIfHovered Ignore = unset Selected
97 | selectIfHovered One = modRole (\x => setIf Selected (is Hover x) x)
98 | selectIfHovered Many =
99 | modRole (\x => setIf Selected (is Hover x || is Selected x) x)