@@ -69,6 +69,12 @@ instance Functor Pattern where
69
69
70
70
instance (NFData a ) => NFData (Pattern a )
71
71
72
+ polymorphic :: Pattern a -> Pattern b
73
+ polymorphic = fmap (const undefined )
74
+
75
+ polymorphicEvent :: Event a -> Event b
76
+ polymorphicEvent = fmap (const undefined )
77
+
72
78
pattern_ :: (State -> [Event a ]) -> Pattern a
73
79
pattern_ f = Pattern f Nothing Nothing
74
80
@@ -233,7 +239,7 @@ instance Monad Pattern where
233
239
--
234
240
-- TODO - what if a continuous pattern contains a discrete one, or vice-versa?
235
241
unwrap :: Pattern (Pattern a ) -> Pattern a
236
- unwrap pp = pp {query = q, pureValue = Nothing }
242
+ unwrap pp = (polymorphic pp) {query = q, pureValue = Nothing }
237
243
where
238
244
q st =
239
245
concatMap
@@ -250,7 +256,7 @@ unwrap pp = pp {query = q, pureValue = Nothing}
250
256
-- | Turns a pattern of patterns into a single pattern. Like @unwrap@,
251
257
-- but structure only comes from the inner pattern.
252
258
innerJoin :: Pattern (Pattern b ) -> Pattern b
253
- innerJoin pp' = pp' {query = q, pureValue = Nothing }
259
+ innerJoin pp' = (polymorphic pp') {query = q, pureValue = Nothing }
254
260
where
255
261
q st =
256
262
concatMap
@@ -266,7 +272,7 @@ innerJoin pp' = pp' {query = q, pureValue = Nothing}
266
272
-- | Turns a pattern of patterns into a single pattern. Like @unwrap@,
267
273
-- but structure only comes from the outer pattern.
268
274
outerJoin :: Pattern (Pattern a ) -> Pattern a
269
- outerJoin pp = pp {query = q, pureValue = Nothing }
275
+ outerJoin pp = (polymorphic pp) {query = q, pureValue = Nothing }
270
276
where
271
277
q st =
272
278
concatMap
@@ -285,7 +291,7 @@ outerJoin pp = pp {query = q, pureValue = Nothing}
285
291
-- TODO - what if a continuous pattern contains a discrete one, or vice-versa?
286
292
-- TODO - steps
287
293
squeezeJoin :: Pattern (Pattern a ) -> Pattern a
288
- squeezeJoin pp = pp {query = q, pureValue = Nothing }
294
+ squeezeJoin pp = (polymorphic pp) {query = q, pureValue = Nothing }
289
295
where
290
296
q st =
291
297
concatMap
@@ -619,7 +625,7 @@ withQueryControls f pat = pat {query = query pat . (\(State a m) -> State a (f m
619
625
-- | @withEvent f p@ returns a new @Pattern@ with each event mapped over
620
626
-- function @f@.
621
627
withEvent :: (Event a -> Event b ) -> Pattern a -> Pattern b
622
- withEvent f p = p {query = map f . query p, pureValue = Nothing }
628
+ withEvent f p = (polymorphic p) {query = map f . query p, pureValue = Nothing }
623
629
624
630
-- | @withEvent f p@ returns a new @Pattern@ with each value mapped over
625
631
-- function @f@.
@@ -629,7 +635,7 @@ withValue f pat = withEvent (fmap f) pat
629
635
-- | @withEvent f p@ returns a new @Pattern@ with f applied to the resulting list of events for each query
630
636
-- function @f@.
631
637
withEvents :: ([Event a ] -> [Event b ]) -> Pattern a -> Pattern b
632
- withEvents f p = p {query = f . query p, pureValue = Nothing }
638
+ withEvents f p = (polymorphic p) {query = f . query p, pureValue = Nothing }
633
639
634
640
-- | @withPart f p@ returns a new @Pattern@ with function @f@ applied
635
641
-- to the part.
@@ -848,7 +854,7 @@ rev p =
848
854
-- | Mark values in the first pattern which match with at least one
849
855
-- value in the second pattern.
850
856
matchManyToOne :: (b -> a -> Bool ) -> Pattern a -> Pattern b -> Pattern (Bool , b )
851
- matchManyToOne f pa pb = pa {query = q, pureValue = Nothing }
857
+ matchManyToOne f pa pb = (polymorphic pa) {query = q, pureValue = Nothing }
852
858
where
853
859
q st = map match $ query pb st
854
860
where
@@ -1299,7 +1305,7 @@ groupEventsBy f (e : es) = eqs : groupEventsBy f (es \\ eqs)
1299
1305
-- assumes that all events in the list have same whole/part
1300
1306
collectEvent :: [Event a ] -> Maybe (Event [a ])
1301
1307
collectEvent [] = Nothing
1302
- collectEvent l@ (e : _) = Just $ e {context = con, value = vs}
1308
+ collectEvent l@ (e : _) = Just $ (polymorphicEvent e) {context = con, value = vs}
1303
1309
where
1304
1310
con = unionC $ map context l
1305
1311
vs = map value l
@@ -1324,7 +1330,7 @@ collect :: (Eq a) => Pattern a -> Pattern [a]
1324
1330
collect = collectBy sameDur
1325
1331
1326
1332
uncollectEvent :: Event [a ] -> [Event a ]
1327
- uncollectEvent e = [e {value = value e !! i, context = resolveContext i (context e)} | i <- [0 .. length (value e) - 1 ]]
1333
+ uncollectEvent e = [(polymorphicEvent e) {value = value e !! i, context = resolveContext i (context e)} | i <- [0 .. length (value e) - 1 ]]
1328
1334
where
1329
1335
resolveContext i (Context xs) = if length xs <= i then Context [] else Context [xs !! i]
1330
1336
0 commit comments