0 | module Data.MSF.Event
2 | import public Data.List.Elem
3 | import public Data.List.Quantifiers.Extra
14 | data Event : (a : Type) -> Type where
16 | Ev : (v : a) -> Event a
24 | project : (0 k : _) -> Elem k ks => Any f ks -> Event (f k)
25 | project _ @{Here} (Here p) = Ev p
26 | project v @{There _} (There p) = project v p
30 | maybeToEvent : Maybe a -> Event a
31 | maybeToEvent Nothing = NoEv
32 | maybeToEvent (Just x) = Ev x
35 | eventToMaybe : Event a -> Maybe a
36 | eventToMaybe NoEv = Nothing
37 | eventToMaybe (Ev v) = Just v
40 | fromEvent : Lazy a -> Event a -> a
41 | fromEvent x NoEv = x
42 | fromEvent _ (Ev v) = v
45 | toEvent : Bool -> Lazy a -> Event a
46 | toEvent False _ = NoEv
47 | toEvent True va = Ev va
50 | event : Lazy b -> Lazy (a -> b) -> Event a -> b
52 | event _ f (Ev x) = f x
55 | unionL : Event a -> Event a -> Event a
56 | unionL (Ev x) _ = Ev x
60 | unionR : Event a -> Event a -> Event a
61 | unionR _ (Ev y) = Ev y
65 | unionWith : (a -> a -> a) -> Event a -> Event a -> Event a
66 | unionWith f (Ev x) (Ev y) = Ev $
f x y
67 | unionWith _ x y = unionL x y
70 | filter : (a -> Bool) -> Event a -> Event a
71 | filter f NoEv = NoEv
72 | filter f (Ev va) = if f va then Ev va else NoEv
79 | Show a => Show (Event a) where
80 | showPrec p NoEv = "NoEv"
81 | showPrec p (Ev v) = showCon p "Ev" $
showArg v
84 | Eq a => Eq (Event a) where
86 | Ev x == Ev y = x == y
90 | Ord a => Ord (Event a) where
91 | compare NoEv NoEv = EQ
92 | compare NoEv (Ev _) = LT
93 | compare (Ev _) NoEv = GT
94 | compare (Ev x) (Ev y) = compare x y
99 | map f (Ev a) = Ev $
f a
102 | Applicative Event where
104 | Ev f <*> Ev a = Ev $
f a
113 | Foldable Event where
115 | foldr f v (Ev a) = f a v
118 | foldl f v (Ev a) = f v a
120 | foldMap _ NoEv = neutral
121 | foldMap f (Ev a) = f a
124 | null (Ev a) = False
126 | public export %inline
127 | Traversable Event where
128 | traverse _ NoEv = pure NoEv
129 | traverse f (Ev a) = Ev <$> f a
131 | public export %inline
132 | Alternative Event where
134 | x <|> y = unionL x y
136 | public export %inline
137 | Semigroup a => Semigroup (Event a) where
138 | (<+>) = unionWith (<+>)
140 | public export %inline
141 | Semigroup a => Monoid (Event a) where
149 | mapMaybe : (a -> Maybe b) -> Event a -> Event b
150 | mapMaybe f ev = ev >>= maybeToEvent . f