on ca187bb help sign in
ChangeLog.md−27
since splitsnapshots
unifiedsplit
@@ -1,35 +1,8 @@
1# Revision history for reflex
1# Revision history for reflex
2
2
3−## 0.8.2.0
4−
5−* Add `matchResponseMapWithRequests`, which it similar to `matchResponsesWithRequests` but allows processing of multiple responses at once.
6−
7−## 0.8.1.1
8−
9−* Allow newer hlint for older GHCs, and add upper bound for newer GHCs
10−
11−## 0.8.1.0
12−
13−* Add support for GHC 8.10
14−* Drop support for GHC < 8.4
15−
16−## 0.8.0.0
17−
18−* Replace 0.7.2.0 with 0.8.0.0 to reflect the `MonadHold` interface change. Deprecates 0.7.2.0.
19−
20−## 0.7.2.0 -- *Deprecated*
21−
22−* ([#416](https://github.com/reflex-frp/reflex/pull/416)) Add `now :: m (Event t ())` to `MonadHold`.
23−* Extend some dependency version bounds
24−* Fix HLint 3 test
25−
26## 0.7.1.1
3## 0.7.1.1
27
4
28−*Backport release*.
29−Changes do not carry forward to 0.7.2.0.
30−
31* Add support for GHC 8.10
5* Add support for GHC 8.10
32−* Drop support for GHC < 8.4
33* Extend some dependency version bounds
6* Extend some dependency version bounds
34* Fix HLint 3 test
7* Fix HLint 3 test
35
8
Quickref.md−1
@@ -54,7 +54,6 @@ Since MonadHold depends on MonadSample, any [S] function also runs in [H] contex
54[ ] difference :: Event a -> Event b -> Event a
54[ ] difference :: Event a -> Event b -> Event a
55[ ] align :: Event a -> Event b -> Event (These a b)
55[ ] align :: Event a -> Event b -> Event (These a b)
56[ ] alignWith :: (These a b -> c) -> Event a -> Event b -> Event c
56[ ] alignWith :: (These a b -> c) -> Event a -> Event b -> Event c
57− -- Note align functions from Data.Align in semialign package
58[ ] mergeWith :: (a -> a -> a) -> [Event a] -> Event a
57[ ] mergeWith :: (a -> a -> a) -> [Event a] -> Event a
59[ ] leftmost :: [Event a] -> Event a
58[ ] leftmost :: [Event a] -> Event a
60[ ] mergeList :: [Event a] -> Event (NonEmpty a)
59[ ] mergeList :: [Event a] -> Event (NonEmpty a)
README.md+22−14
@@ -1,23 +1,31 @@
1−# [Reflex](https://reflex-frp.org/)
1+## [Reflex](https://reflex-frp.org/)
2
2
3[![Haskell](https://img.shields.io/badge/language-Haskell-orange.svg)](https://haskell.org) [![Hackage](https://img.shields.io/hackage/v/reflex.svg)](https://hackage.haskell.org/package/reflex) [![Hackage CI](https://matrix.hackage.haskell.org/api/v2/packages/reflex/badge)](https://matrix.hackage.haskell.org/#/package/reflex) [![BSD3 License](https://img.shields.io/badge/license-BSD3-blue.svg)](https://github.com/reflex-frp/reflex/blob/master/LICENSE)
3[![Haskell](https://img.shields.io/badge/language-Haskell-orange.svg)](https://haskell.org) [![Hackage](https://img.shields.io/hackage/v/reflex.svg)](https://hackage.haskell.org/package/reflex) [![Hackage CI](https://matrix.hackage.haskell.org/api/v2/packages/reflex/badge)](https://matrix.hackage.haskell.org/#/package/reflex) [![BSD3 License](https://img.shields.io/badge/license-BSD3-blue.svg)](https://github.com/reflex-frp/reflex/blob/master/LICENSE)
4
4
5−Interactive programs without callbacks or side-effects. Functional Reactive Programming (FRP) uses composable events and time-varying values to describe interactive systems as pure functions. Just like other pure functional code, functional reactive code is easier to get right on the first try, maintain, and reuse.
5+### Practical Functional Reactive Programming
6
6
7−Reflex is a fully-deterministic, higher-order Functional Reactive Programming interface and an engine that efficiently implements that interface.
7+Reflex is a fully-deterministic, higher-order Functional Reactive Programming (FRP) interface and an engine that efficiently implements that interface.
8
8
9−**Visit https://reflex-frp.org for more information, tutorials, documentation and [examples](https://examples.reflex-frp.org/).**
9+[Reflex-DOM](https://github.com/reflex-frp/reflex-dom) is a framework built on Reflex that facilitates the development of web pages, including highly-interactive single-page apps.
10
10
11−## Resources
11+A summary of Reflex functions is available in the [quick reference](Quickref.md).
12
12
13−* [Official Website](https://reflex-frp.org)
13+**Visit https://reflex-frp.org/ for more information, tutorials, documentation and [examples](https://examples.reflex-frp.org/).**
14−* [Quick Reference](Quickref.md)
15−* [Reflex-DOM](https://github.com/reflex-frp/reflex-dom): A framework built on Reflex that facilitates the development of web pages, including highly-interactive single-page apps.
16−* [Obelisk](https://github.com/obsidiansystems/obelisk#obelisk): A framework built on Reflex and Reflex-DOM for functional reactive web and mobile applications, with batteries included.
17−* [Get started with Reflex](https://github.com/reflex-frp/reflex-platform)
18−* [/r/reflexfrp](https://www.reddit.com/r/reflexfrp)
19−* [irc.freenode.net #reflex-frp](http://webchat.freenode.net?channels=%23reflex-frp&uio=d4)
20
14
21−## Hacking
15+### Resources
16+[Get started with Reflex](https://github.com/reflex-frp/reflex-platform)
22
17
23−From the root of a [Reflex Platform](https://github.com/reflex-frp/reflex-platform) checkout, run `./scripts/hack-on haskell-overlays/reflex-packages/dep/reflex`. This will check out the reflex source code into the `haskell-overlays/reflex-packages/dep/reflex` directory. You can then point that checkout at your fork, make changes, etc. Use the `./try-reflex` or `./scripts/work-on` scripts to start a shell in which you can test your changes.
18+[/r/reflexfrp](https://www.reddit.com/r/reflexfrp)
19+
20+[irc.freenode.net #reflex-frp](http://webchat.freenode.net?channels=%23reflex-frp&uio=d4)
21+
22+### Hacking
23+
24+From the root of a [Reflex
25+Platform](https://github.com/reflex-frp/reflex-platform) checkout, run
26+`./scripts/hack-on haskell-overlays/reflex-packages/dep/reflex`. This
27+will check out the reflex source code into the
28+`haskell-overlays/reflex-packages/dep/reflex` directory. You can then
29+point that checkout at your fork, make changes, etc. Use the
30+`./try-reflex` or `./scripts/work-on` scripts to start a shell in
31+which you can test your changes.
reflex.cabal+8−29
@@ -1,17 +1,7 @@
1Name: reflex
1Name: reflex
2−Version: 0.8.2.0
2+Version: 0.7.1.1
3Synopsis: Higher-order Functional Reactive Programming
3Synopsis: Higher-order Functional Reactive Programming
4−Description:
5− Interactive programs without callbacks or side-effects.
6− Functional Reactive Programming (FRP) uses composable events and time-varying
7− values to describe interactive systems as pure functions.
8− Just like other pure functional code, functional reactive code is easier
9− to get right on the first try, maintain, and reuse.
10− .
11− Reflex is a fully-deterministic, higher-order Functional Reactive Programming
4+Description: Reflex is a high-performance, deterministic, higher-order Functional Reactive Programming system
12− interface and an engine that efficiently implements that interface.
13− .
14− <https://reflex-frp.org>
15License: BSD3
5License: BSD3
16License-file: LICENSE
6License-file: LICENSE
17Author: Ryan Trinkle
7Author: Ryan Trinkle
@@ -74,7 +64,6 @@ library
74 base >= 4.11 && < 4.15,
64 base >= 4.11 && < 4.15,
75 bifunctors >= 5.2 && < 5.6,
65 bifunctors >= 5.2 && < 5.6,
76 comonad >= 5.0.4 && < 5.1,
66 comonad >= 5.0.4 && < 5.1,
77− constraints >= 0.10 && <0.14,
78 constraints-extras >= 0.3 && < 0.4,
67 constraints-extras >= 0.3 && < 0.4,
79 containers >= 0.6 && < 0.7,
68 containers >= 0.6 && < 0.7,
80 data-default >= 0.5 && < 0.8,
69 data-default >= 0.5 && < 0.8,
@@ -97,7 +86,7 @@ library
97 time >= 1.4 && < 1.10,
86 time >= 1.4 && < 1.10,
98 transformers >= 0.5.6.0 && < 0.6,
87 transformers >= 0.5.6.0 && < 0.6,
99 unbounded-delays >= 0.1.0.0 && < 0.2,
88 unbounded-delays >= 0.1.0.0 && < 0.2,
100− witherable >= 0.3 && < 0.5
89+ witherable >= 0.3 && < 0.4
101
90
102 if flag(split-these)
91 if flag(split-these)
103 build-depends: these >= 1 && <1.2,
92 build-depends: these >= 1 && <1.2,
@@ -166,8 +155,7 @@ library
166
155
167 if flag(debug-trace-events)
156 if flag(debug-trace-events)
168 cpp-options: -DDEBUG_TRACE_EVENTS
157 cpp-options: -DDEBUG_TRACE_EVENTS
169− build-depends:
158+ build-depends: bytestring
170− bytestring >= 0.10.8 && < 0.11
171
159
172 if flag(use-reflex-optimizer)
160 if flag(use-reflex-optimizer)
173 cpp-options: -DUSE_REFLEX_OPTIMIZER
161 cpp-options: -DUSE_REFLEX_OPTIMIZER
@@ -192,14 +180,13 @@ library
192 other-extensions: TemplateHaskell
180 other-extensions: TemplateHaskell
193 else
181 else
194 build-depends:
182 build-depends:
195− dependent-sum >= 0.6 && < 0.8
183+ dependent-sum >= 0.6 && < 0.7
196
184
197 if flag(fast-weak) && impl(ghcjs)
185 if flag(fast-weak) && impl(ghcjs)
198 cpp-options: -DGHCJS_FAST_WEAK
186 cpp-options: -DGHCJS_FAST_WEAK
199
187
200 if impl(ghcjs)
188 if impl(ghcjs)
201− build-depends:
189+ build-depends: ghcjs-base
202− ghcjs-base == 0.2.*
203
190
204test-suite semantics
191test-suite semantics
205 default-language: Haskell2010
192 default-language: Haskell2010
@@ -259,9 +246,9 @@ test-suite hlint
259 , filepath
246 , filepath
260 , filemanip
247 , filemanip
261 if impl(ghc >= 8.8)
248 if impl(ghc >= 8.8)
262− build-depends: hlint >= 3 && < 4
249+ build-depends: hlint >= 3
263 else
250 else
264− build-depends: hlint (< 2.1 || >= 2.2.2) && < 4
251+ build-depends: hlint (< 2.1 || >= 2.2.2) && < 3
265 if impl(ghcjs)
252 if impl(ghcjs)
266 buildable: False
253 buildable: False
267
254
@@ -346,14 +333,6 @@ test-suite RequesterT
346 Reflex.Plan.Pure
333 Reflex.Plan.Pure
347 Test.Run
334 Test.Run
348
335
349−test-suite Headless
350− default-language: Haskell2010
351− type: exitcode-stdio-1.0
352− main-is: Headless.hs
353− hs-source-dirs: test
354− build-depends: base
355− , reflex
356−
357test-suite Adjustable
336test-suite Adjustable
358 default-language: Haskell2010
337 default-language: Haskell2010
359 type: exitcode-stdio-1.0
338 type: exitcode-stdio-1.0
src/Reflex/BehaviorWriter/Base.hs+4−13
@@ -24,7 +24,6 @@ module Reflex.BehaviorWriter.Base
24import Control.Monad.Exception
24import Control.Monad.Exception
25import Control.Monad.Identity
25import Control.Monad.Identity
26import Control.Monad.IO.Class
26import Control.Monad.IO.Class
27−import Control.Monad.Morph
28import Control.Monad.Reader
27import Control.Monad.Reader
29import Control.Monad.Ref
28import Control.Monad.Ref
30import Control.Monad.State.Strict
29import Control.Monad.State.Strict
@@ -49,18 +48,7 @@ import Reflex.TriggerEvent.Class
49
48
50-- | A basic implementation of 'BehaviorWriter'.
49-- | A basic implementation of 'BehaviorWriter'.
51newtype BehaviorWriterT t w m a = BehaviorWriterT { unBehaviorWriterT :: StateT [Behavior t w] m a }
50newtype BehaviorWriterT t w m a = BehaviorWriterT { unBehaviorWriterT :: StateT [Behavior t w] m a }
52− -- The list is kept in reverse order
51+ deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadAsyncException, MonadException) -- The list is kept in reverse order
53− deriving
54− ( Functor
55− , Applicative
56− , Monad
57− , MonadTrans
58− , MFunctor
59− , MonadIO
60− , MonadFix
61− , MonadAsyncException
62− , MonadException
63− )
64
52
65-- | Run a 'BehaviorWriterT' action. The behavior writer output will be provided
53-- | Run a 'BehaviorWriterT' action. The behavior writer output will be provided
66-- along with the result of the action.
54-- along with the result of the action.
@@ -85,6 +73,9 @@ withBehaviorWriterT f dw = do
85deriving instance MonadHold t m => MonadHold t (BehaviorWriterT t w m)
73deriving instance MonadHold t m => MonadHold t (BehaviorWriterT t w m)
86deriving instance MonadSample t m => MonadSample t (BehaviorWriterT t w m)
74deriving instance MonadSample t m => MonadSample t (BehaviorWriterT t w m)
87
75
76+instance MonadTrans (BehaviorWriterT t w) where
77+ lift = BehaviorWriterT . lift
78+
88instance MonadRef m => MonadRef (BehaviorWriterT t w m) where
79instance MonadRef m => MonadRef (BehaviorWriterT t w m) where
89 type Ref (BehaviorWriterT t w m) = Ref m
80 type Ref (BehaviorWriterT t w m) = Ref m
90 newRef = lift . newRef
81 newRef = lift . newRef
src/Reflex/Class.hs−13
@@ -421,13 +421,6 @@ class MonadSample t m => MonadHold t m where
421 -- | Create a new 'Event' that only occurs only once, on the first occurrence of
421 -- | Create a new 'Event' that only occurs only once, on the first occurrence of
422 -- the supplied 'Event'.
422 -- the supplied 'Event'.
423 headE :: Event t a -> m (Event t a)
423 headE :: Event t a -> m (Event t a)
424− -- | An event which only occurs at the current moment in time, such that:
425− --
426− -- > coincidence (pushAlways (\a -> (a <$) <$> now) e) = e
427− --
428− now :: m (Event t ())
429− default now :: (m ~ f m', MonadTrans f, MonadHold t m') => m (Event t ())
430− now = lift now
431
424
432-- | Accumulate an 'Incremental' with the supplied initial value and the firings of the provided 'Event',
425-- | Accumulate an 'Incremental' with the supplied initial value and the firings of the provided 'Event',
433-- using the combining function to produce a patch.
426-- using the combining function to produce a patch.
@@ -573,7 +566,6 @@ instance MonadHold t m => MonadHold t (ReaderT r m) where
573 holdIncremental a0 = lift . holdIncremental a0
566 holdIncremental a0 = lift . holdIncremental a0
574 buildDynamic a0 = lift . buildDynamic a0
567 buildDynamic a0 = lift . buildDynamic a0
575 headE = lift . headE
568 headE = lift . headE
576− now = lift now
577
569
578instance (MonadSample t m, Monoid r) => MonadSample t (WriterT r m) where
570instance (MonadSample t m, Monoid r) => MonadSample t (WriterT r m) where
579 sample = lift . sample
571 sample = lift . sample
@@ -584,7 +576,6 @@ instance (MonadHold t m, Monoid r) => MonadHold t (WriterT r m) where
584 holdIncremental a0 = lift . holdIncremental a0
576 holdIncremental a0 = lift . holdIncremental a0
585 buildDynamic a0 = lift . buildDynamic a0
577 buildDynamic a0 = lift . buildDynamic a0
586 headE = lift . headE
578 headE = lift . headE
587− now = lift now
588
579
589instance MonadSample t m => MonadSample t (StateT s m) where
580instance MonadSample t m => MonadSample t (StateT s m) where
590 sample = lift . sample
581 sample = lift . sample
@@ -595,7 +586,6 @@ instance MonadHold t m => MonadHold t (StateT s m) where
595 holdIncremental a0 = lift . holdIncremental a0
586 holdIncremental a0 = lift . holdIncremental a0
596 buildDynamic a0 = lift . buildDynamic a0
587 buildDynamic a0 = lift . buildDynamic a0
597 headE = lift . headE
588 headE = lift . headE
598− now = lift now
599
589
600instance MonadSample t m => MonadSample t (ExceptT e m) where
590instance MonadSample t m => MonadSample t (ExceptT e m) where
601 sample = lift . sample
591 sample = lift . sample
@@ -606,7 +596,6 @@ instance MonadHold t m => MonadHold t (ExceptT e m) where
606 holdIncremental a0 = lift . holdIncremental a0
596 holdIncremental a0 = lift . holdIncremental a0
607 buildDynamic a0 = lift . buildDynamic a0
597 buildDynamic a0 = lift . buildDynamic a0
608 headE = lift . headE
598 headE = lift . headE
609− now = lift now
610
599
611instance (MonadSample t m, Monoid w) => MonadSample t (RWST r w s m) where
600instance (MonadSample t m, Monoid w) => MonadSample t (RWST r w s m) where
612 sample = lift . sample
601 sample = lift . sample
@@ -617,7 +606,6 @@ instance (MonadHold t m, Monoid w) => MonadHold t (RWST r w s m) where
617 holdIncremental a0 = lift . holdIncremental a0
606 holdIncremental a0 = lift . holdIncremental a0
618 buildDynamic a0 = lift . buildDynamic a0
607 buildDynamic a0 = lift . buildDynamic a0
619 headE = lift . headE
608 headE = lift . headE
620− now = lift now
621
609
622instance MonadSample t m => MonadSample t (ContT r m) where
610instance MonadSample t m => MonadSample t (ContT r m) where
623 sample = lift . sample
611 sample = lift . sample
@@ -628,7 +616,6 @@ instance MonadHold t m => MonadHold t (ContT r m) where
628 holdIncremental a0 = lift . holdIncremental a0
616 holdIncremental a0 = lift . holdIncremental a0
629 buildDynamic a0 = lift . buildDynamic a0
617 buildDynamic a0 = lift . buildDynamic a0
630 headE = lift . headE
618 headE = lift . headE
631− now = lift now
632
619
633--------------------------------------------------------------------------------
620--------------------------------------------------------------------------------
634-- Convenience functions
621-- Convenience functions
src/Reflex/Dynamic.hs+1−1
@@ -348,7 +348,7 @@ factorDyn d = buildDynamic (sample (current d) >>= holdKey) update where
348--
348--
349-- > demuxed (demux d) k === fmap (== k) d
349-- > demuxed (demux d) k === fmap (== k) d
350--
350--
351−-- However, when 'demuxed' is used multiple times, the complexity is only
351+-- However, when getDemuxed is used multiple times, the complexity is only
352-- /O(log(n))/, rather than /O(n)/ for fmap.
352-- /O(log(n))/, rather than /O(n)/ for fmap.
353data Demux t k = Demux { demuxValue :: Behavior t k
353data Demux t k = Demux { demuxValue :: Behavior t k
354 , demuxSelector :: EventSelector t (Const2 k Bool)
354 , demuxSelector :: EventSelector t (Const2 k Bool)
src/Reflex/DynamicWriter/Base.hs+4−13
@@ -22,7 +22,6 @@ module Reflex.DynamicWriter.Base
22import Control.Monad.Exception
22import Control.Monad.Exception
23import Control.Monad.Identity
23import Control.Monad.Identity
24import Control.Monad.IO.Class
24import Control.Monad.IO.Class
25−import Control.Monad.Morph
26import Control.Monad.Primitive
25import Control.Monad.Primitive
27import Control.Monad.Reader
26import Control.Monad.Reader
28import Control.Monad.Ref
27import Control.Monad.Ref
@@ -52,6 +51,9 @@ import Reflex.Query.Class
52import Reflex.Requester.Class
51import Reflex.Requester.Class
53import Reflex.TriggerEvent.Class
52import Reflex.TriggerEvent.Class
54
53
54+instance MonadTrans (DynamicWriterT t w) where
55+ lift = DynamicWriterT . lift
56+
55mapIncrementalMapValues :: (Reflex t, Patch (p v), Patch (p v'), PatchTarget (p v) ~ f v, PatchTarget (p v') ~ f v', Functor p, Functor f) => (v -> v') -> Incremental t (p v) -> Incremental t (p v')
57mapIncrementalMapValues :: (Reflex t, Patch (p v), Patch (p v'), PatchTarget (p v) ~ f v, PatchTarget (p v') ~ f v', Functor p, Functor f) => (v -> v') -> Incremental t (p v) -> Incremental t (p v')
56mapIncrementalMapValues f = unsafeMapIncremental (fmap f) (fmap f)
58mapIncrementalMapValues f = unsafeMapIncremental (fmap f) (fmap f)
57
59
@@ -88,18 +90,7 @@ mergeDynIncrementalWithMove a = unsafeBuildIncremental (mapM (sample . current)
88
90
89-- | A basic implementation of 'DynamicWriter'.
91-- | A basic implementation of 'DynamicWriter'.
90newtype DynamicWriterT t w m a = DynamicWriterT { unDynamicWriterT :: StateT [Dynamic t w] m a }
92newtype DynamicWriterT t w m a = DynamicWriterT { unDynamicWriterT :: StateT [Dynamic t w] m a }
91− -- The list is kept in reverse order
93+ deriving (Functor, Applicative, Monad, MonadIO, MonadFix, MonadAsyncException, MonadException) -- The list is kept in reverse order
92− deriving
93− ( Functor
94− , Applicative
95− , Monad
96− , MonadTrans
97− , MFunctor
98− , MonadIO
99− , MonadFix
100− , MonadAsyncException
101− , MonadException
102− )
103
94
104deriving instance MonadHold t m => MonadHold t (DynamicWriterT t w m)
95deriving instance MonadHold t m => MonadHold t (DynamicWriterT t w m)
105deriving instance MonadSample t m => MonadSample t (DynamicWriterT t w m)
96deriving instance MonadSample t m => MonadSample t (DynamicWriterT t w m)
src/Reflex/EventWriter/Base.hs+4−14
@@ -35,7 +35,6 @@ import Reflex.TriggerEvent.Class
35
35
36import Control.Monad.Exception
36import Control.Monad.Exception
37import Control.Monad.Identity
37import Control.Monad.Identity
38−import Control.Monad.Morph
39import Control.Monad.Primitive
38import Control.Monad.Primitive
40import Control.Monad.Reader
39import Control.Monad.Reader
41import Control.Monad.Ref
40import Control.Monad.Ref
@@ -98,17 +97,7 @@ data EventWriterState t w = EventWriterState
98
97
99-- | A basic implementation of 'EventWriter'.
98-- | A basic implementation of 'EventWriter'.
100newtype EventWriterT t w m a = EventWriterT { unEventWriterT :: StateT (EventWriterState t w) m a }
99newtype EventWriterT t w m a = EventWriterT { unEventWriterT :: StateT (EventWriterState t w) m a }
101− deriving
100+ deriving (Functor, Applicative, Monad, MonadFix, MonadIO, MonadException, MonadAsyncException)
102− ( Functor
103− , Applicative
104− , Monad
105− , MonadTrans
106− , MFunctor
107− , MonadFix
108− , MonadIO
109− , MonadException
110− , MonadAsyncException
111− )
112
101
113-- | Run a 'EventWriterT' action.
102-- | Run a 'EventWriterT' action.
114runEventWriterT :: forall t m w a. (Reflex t, Monad m, Semigroup w) => EventWriterT t w m a -> m (a, Event t w)
103runEventWriterT :: forall t m w a. (Reflex t, Monad m, Semigroup w) => EventWriterT t w m a -> m (a, Event t w)
@@ -128,6 +117,9 @@ instance (Reflex t, Monad m, Semigroup w) => EventWriter t w (EventWriterT t w m
128 , _eventWriterState_told = (tellId myId :=> w) : _eventWriterState_told old
117 , _eventWriterState_told = (tellId myId :=> w) : _eventWriterState_told old
129 }
118 }
130
119
120+instance MonadTrans (EventWriterT t w) where
121+ lift = EventWriterT . lift
122+
131instance MonadSample t m => MonadSample t (EventWriterT t w m) where
123instance MonadSample t m => MonadSample t (EventWriterT t w m) where
132 sample = lift . sample
124 sample = lift . sample
133
125
@@ -142,8 +134,6 @@ instance MonadHold t m => MonadHold t (EventWriterT t w m) where
142 buildDynamic a0 = lift . buildDynamic a0
134 buildDynamic a0 = lift . buildDynamic a0
143 {-# INLINABLE headE #-}
135 {-# INLINABLE headE #-}
144 headE = lift . headE
136 headE = lift . headE
145− {-# INLINABLE now #-}
146− now = lift now
147
137
148instance (Reflex t, Adjustable t m, MonadHold t m, Semigroup w) => Adjustable t (EventWriterT t w m) where
138instance (Reflex t, Adjustable t m, MonadHold t m, Semigroup w) => Adjustable t (EventWriterT t w m) where
149 runWithReplace = runWithReplaceEventWriterTWith $ \dm0 dm' -> lift $ runWithReplace dm0 dm'
139 runWithReplace = runWithReplaceEventWriterTWith $ \dm0 dm' -> lift $ runWithReplace dm0 dm'
src/Reflex/Host/Headless.hs+9−11
@@ -7,7 +7,6 @@
7module Reflex.Host.Headless where
7module Reflex.Host.Headless where
8
8
9import Control.Concurrent.Chan (newChan, readChan)
9import Control.Concurrent.Chan (newChan, readChan)
10−import Control.Monad (unless)
11import Control.Monad.Fix (MonadFix, fix)
10import Control.Monad.Fix (MonadFix, fix)
12import Control.Monad.IO.Class (MonadIO, liftIO)
11import Control.Monad.IO.Class (MonadIO, liftIO)
13import Control.Monad.Primitive (PrimMonad)
12import Control.Monad.Primitive (PrimMonad)
@@ -16,7 +15,7 @@ import Data.Dependent.Sum (DSum (..), (==>))
16import Data.Foldable (for_)
15import Data.Foldable (for_)
17import Data.Functor.Identity (Identity(..))
16import Data.Functor.Identity (Identity(..))
18import Data.IORef (IORef, readIORef)
17import Data.IORef (IORef, readIORef)
19−import Data.Maybe (catMaybes, fromMaybe)
18+import Data.Maybe (catMaybes)
20import Data.Traversable (for)
19import Data.Traversable (for)
21
20
22import Reflex
21import Reflex
@@ -83,33 +82,32 @@ runHeadlessApp guest =
83 -- 'Nothing' if the guest application hasn't subscribed to this event.
82 -- 'Nothing' if the guest application hasn't subscribed to this event.
84 mPostBuildTrigger <- readRef postBuildTriggerRef
83 mPostBuildTrigger <- readRef postBuildTriggerRef
85
84
85+ -- When there is a subscriber to the post-build event, fire the event.
86+ for_ mPostBuildTrigger $ \postBuildTrigger ->
87+ fire [postBuildTrigger :=> Identity ()] $ pure ()
88+
86 -- Subscribe to an 'Event' of that the guest application can use to
89 -- Subscribe to an 'Event' of that the guest application can use to
87 -- request application shutdown. We'll check whether this 'Event' is firing
90 -- request application shutdown. We'll check whether this 'Event' is firing
88 -- to determine whether to terminate.
91 -- to determine whether to terminate.
89 shutdown <- subscribeEvent result
92 shutdown <- subscribeEvent result
90
93
91− -- When there is a subscriber to the post-build event, fire the event.
92− soa <- for mPostBuildTrigger $ \postBuildTrigger ->
93− fire [postBuildTrigger :=> Identity ()] $ isFiring shutdown
94−
95 -- The main application loop. We wait for new events and fire those that
94 -- The main application loop. We wait for new events and fire those that
96 -- have subscribers. If we detect a shutdown request, the application
95 -- have subscribers. If we detect a shutdown request, the application
97 -- terminates.
96 -- terminates.
98− unless (or (fromMaybe [] soa)) $ fix $ \loop -> do
97+ fix $ \loop -> do
99 -- Read the next event (blocking).
98 -- Read the next event (blocking).
100 ers <- liftIO $ readChan events
99 ers <- liftIO $ readChan events
101 stop <- do
100 stop <- do
102 -- Fire events that have subscribers.
101 -- Fire events that have subscribers.
103 fireEventTriggerRefs fc ers $
102 fireEventTriggerRefs fc ers $
104 -- Check if the shutdown 'Event' is firing.
103 -- Check if the shutdown 'Event' is firing.
105− isFiring shutdown
104+ readEvent shutdown >>= \case
105+ Nothing -> pure False
106+ Just _ -> pure True
106 if or stop
107 if or stop
107 then pure ()
108 then pure ()
108 else loop
109 else loop
109 where
110 where
110− isFiring ev = readEvent ev >>= \case
111− Nothing -> pure False
112− Just _ -> pure True
113 -- Use the given 'FireCommand' to fire events that have subscribers
111 -- Use the given 'FireCommand' to fire events that have subscribers
114 -- and call the callback for the 'TriggerInvocation' of each.
112 -- and call the callback for the 'TriggerInvocation' of each.
115 fireEventTriggerRefs
113 fireEventTriggerRefs
src/Reflex/PerformEvent/Base.hs−2
@@ -164,8 +164,6 @@ instance (ReflexHost t, MonadHold t m) => MonadHold t (PerformEventT t m) where
164 buildDynamic getV0 v' = PerformEventT $ lift $ buildDynamic getV0 v'
164 buildDynamic getV0 v' = PerformEventT $ lift $ buildDynamic getV0 v'
165 {-# INLINABLE headE #-}
165 {-# INLINABLE headE #-}
166 headE = PerformEventT . lift . headE
166 headE = PerformEventT . lift . headE
167− {-# INLINABLE now #-}
168− now = PerformEventT . lift $ now
169
167
170instance (MonadRef (HostFrame t), ReflexHost t) => MonadRef (PerformEventT t m) where
168instance (MonadRef (HostFrame t), ReflexHost t) => MonadRef (PerformEventT t m) where
171 type Ref (PerformEventT t m) = Ref (HostFrame t)
169 type Ref (PerformEventT t m) = Ref (HostFrame t)
src/Reflex/PostBuild/Base.hs−2
@@ -83,8 +83,6 @@ instance MonadHold t m => MonadHold t (PostBuildT t m) where
83 buildDynamic a0 = lift . buildDynamic a0
83 buildDynamic a0 = lift . buildDynamic a0
84 {-# INLINABLE headE #-}
84 {-# INLINABLE headE #-}
85 headE = lift . headE
85 headE = lift . headE
86− {-# INLINABLE now #-}
87− now = lift now
88
86
89instance PerformEvent t m => PerformEvent t (PostBuildT t m) where
87instance PerformEvent t m => PerformEvent t (PostBuildT t m) where
90 type Performable (PostBuildT t m) = Performable m
88 type Performable (PostBuildT t m) = Performable m
src/Reflex/Profiled.hs−1
@@ -184,7 +184,6 @@ instance MonadHold t m => MonadHold (ProfiledTimeline t) (ProfiledM m) where
184 holdIncremental v0 (Event_Profiled v') = ProfiledM $ Incremental_Profiled <$> holdIncremental v0 v'
184 holdIncremental v0 (Event_Profiled v') = ProfiledM $ Incremental_Profiled <$> holdIncremental v0 v'
185 buildDynamic (ProfiledM v0) (Event_Profiled v') = ProfiledM $ Dynamic_Profiled <$> buildDynamic v0 v'
185 buildDynamic (ProfiledM v0) (Event_Profiled v') = ProfiledM $ Dynamic_Profiled <$> buildDynamic v0 v'
186 headE (Event_Profiled e) = ProfiledM $ Event_Profiled <$> headE e
186 headE (Event_Profiled e) = ProfiledM $ Event_Profiled <$> headE e
187− now = ProfiledM $ Event_Profiled <$> now
188
187
189instance MonadSample t m => MonadSample (ProfiledTimeline t) (ProfiledM m) where
188instance MonadSample t m => MonadSample (ProfiledTimeline t) (ProfiledM m) where
190 sample (Behavior_Profiled b) = ProfiledM $ sample b
189 sample (Behavior_Profiled b) = ProfiledM $ sample b
src/Reflex/Pure.hs−4
@@ -211,7 +211,3 @@ instance (Enum t, HasTrie t, Ord t) => MonadHold (Pure t) ((->) t) where
211 Just x -> fromMaybe lastValue $ apply x lastValue
211 Just x -> fromMaybe lastValue $ apply x lastValue
212
212
213 headE = slowHeadE
213 headE = slowHeadE
214− now t = Event $ guard . (t ==)
215−
216−
217−
src/Reflex/Query/Base.hs−4
@@ -22,7 +22,6 @@ module Reflex.Query.Base
22import Control.Applicative (liftA2)
22import Control.Applicative (liftA2)
23import Control.Monad.Exception
23import Control.Monad.Exception
24import Control.Monad.Fix
24import Control.Monad.Fix
25−import Control.Monad.Morph
26import Control.Monad.Primitive
25import Control.Monad.Primitive
27import Control.Monad.Reader
26import Control.Monad.Reader
28import Control.Monad.Ref
27import Control.Monad.Ref
@@ -240,9 +239,6 @@ instance (Reflex t, MonadFix m, Group q, Additive q, Query q, Eq q, MonadHold t
240instance MonadTrans (QueryT t q) where
239instance MonadTrans (QueryT t q) where
241 lift = QueryT . lift . lift . lift
240 lift = QueryT . lift . lift . lift
242
241
243−instance MFunctor (QueryT t q) where
244− hoist = mapQueryT
245−
246instance PrimMonad m => PrimMonad (QueryT t q m) where
242instance PrimMonad m => PrimMonad (QueryT t q m) where
247 type PrimState (QueryT t q m) = PrimState m
243 type PrimState (QueryT t q m) = PrimState m
248 primitive = lift . primitive
244 primitive = lift . primitive
src/Reflex/Requester/Base.hs+26−95
@@ -1,7 +1,6 @@
1-- | This module provides 'RequesterT', the standard implementation of
1-- | This module provides 'RequesterT', the standard implementation of
2-- 'Requester'.
2-- 'Requester'.
3{-# LANGUAGE AllowAmbiguousTypes #-}
3{-# LANGUAGE AllowAmbiguousTypes #-}
4−{-# LANGUAGE ApplicativeDo #-}
5{-# LANGUAGE CPP #-}
4{-# LANGUAGE CPP #-}
6{-# LANGUAGE EmptyDataDecls #-}
5{-# LANGUAGE EmptyDataDecls #-}
7{-# LANGUAGE ExistentialQuantification #-}
6{-# LANGUAGE ExistentialQuantification #-}
@@ -33,7 +32,6 @@ module Reflex.Requester.Base
33 , requesterDataToList
32 , requesterDataToList
34 , singletonRequesterData
33 , singletonRequesterData
35 , matchResponsesWithRequests
34 , matchResponsesWithRequests
36− , matchResponseMapWithRequests
37 , multiEntry
35 , multiEntry
38 , unMultiEntry
36 , unMultiEntry
39 , requesting'
37 , requesting'
@@ -51,14 +49,12 @@ import Reflex.TriggerEvent.Class
51import Control.Applicative (liftA2)
49import Control.Applicative (liftA2)
52import Control.Monad.Exception
50import Control.Monad.Exception
53import Control.Monad.Identity
51import Control.Monad.Identity
54−import Control.Monad.Morph
55import Control.Monad.Primitive
52import Control.Monad.Primitive
56import Control.Monad.Reader
53import Control.Monad.Reader
57import Control.Monad.Ref
54import Control.Monad.Ref
58import Control.Monad.State.Strict
55import Control.Monad.State.Strict
59import Data.Bits
56import Data.Bits
60import Data.Coerce
57import Data.Coerce
61−import Data.Constraint
62import Data.Dependent.Map (DMap)
58import Data.Dependent.Map (DMap)
63import qualified Data.Dependent.Map as DMap
59import qualified Data.Dependent.Map as DMap
64import Data.Dependent.Sum (DSum (..))
60import Data.Dependent.Sum (DSum (..))
@@ -84,51 +80,19 @@ newtype TagMap (f :: * -> *) = TagMap (IntMap Any)
84
80
85newtype RequesterData f = RequesterData (TagMap (Entry f))
81newtype RequesterData f = RequesterData (TagMap (Entry f))
86
82
87−emptyRequesterData :: RequesterData f
88−emptyRequesterData = RequesterData $ TagMap IntMap.empty
89−
90data RequesterDataKey a where
83data RequesterDataKey a where
91 RequesterDataKey_Single :: {-# UNPACK #-} !(MyTag (Single a)) -> RequesterDataKey a
84 RequesterDataKey_Single :: {-# UNPACK #-} !(MyTag (Single a)) -> RequesterDataKey a
92 RequesterDataKey_Multi :: {-# UNPACK #-} !(MyTag Multi) -> {-# UNPACK #-} !Int -> !(RequesterDataKey a) -> RequesterDataKey a --TODO: Don't put a second Int here (or in the other Multis); use a single Int instead
85 RequesterDataKey_Multi :: {-# UNPACK #-} !(MyTag Multi) -> {-# UNPACK #-} !Int -> !(RequesterDataKey a) -> RequesterDataKey a --TODO: Don't put a second Int here (or in the other Multis); use a single Int instead
93− RequesterDataKey_Multi2 :: GCompare k => {-# UNPACK #-} !(MyTag (Multi2 k)) -> !(Some k) -> {-# UNPACK #-} !Int -> !(RequesterDataKey a) -> RequesterDataKey a
86+ RequesterDataKey_Multi2 :: {-# UNPACK #-} !(MyTag (Multi2 k)) -> !(Some k) -> {-# UNPACK #-} !Int -> !(RequesterDataKey a) -> RequesterDataKey a
94 RequesterDataKey_Multi3 :: {-# UNPACK #-} !(MyTag Multi3) -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> !(RequesterDataKey a) -> RequesterDataKey a
87 RequesterDataKey_Multi3 :: {-# UNPACK #-} !(MyTag Multi3) -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> !(RequesterDataKey a) -> RequesterDataKey a
95
88
96singletonRequesterData :: RequesterDataKey a -> f a -> RequesterData f
89singletonRequesterData :: RequesterDataKey a -> f a -> RequesterData f
97singletonRequesterData rdk v = case rdk of
90singletonRequesterData rdk v = case rdk of
98 RequesterDataKey_Single k -> RequesterData $ singletonTagMap k $ Entry v
91 RequesterDataKey_Single k -> RequesterData $ singletonTagMap k $ Entry v
99 RequesterDataKey_Multi k k' k'' -> RequesterData $ singletonTagMap k $ Entry $ IntMap.singleton k' $ singletonRequesterData k'' v
92 RequesterDataKey_Multi k k' k'' -> RequesterData $ singletonTagMap k $ Entry $ IntMap.singleton k' $ singletonRequesterData k'' v
100− RequesterDataKey_Multi2 k k' k'' k''' -> RequesterData $ singletonTagMap k $ Entry $ Multi2Contents
93+ RequesterDataKey_Multi2 k k' k'' k''' -> RequesterData $ singletonTagMap k $ Entry $ Map.singleton k' $ IntMap.singleton k'' $ singletonRequesterData k''' v
101− { _multi2Contents_values = Map.singleton k' $ IntMap.singleton k'' $ singletonRequesterData k''' v
102− , _multi2Contents_dict = Dict
103− }
104 RequesterDataKey_Multi3 k k' k'' k''' -> RequesterData $ singletonTagMap k $ Entry $ IntMap.singleton k' $ IntMap.singleton k'' $ singletonRequesterData k''' v
94 RequesterDataKey_Multi3 k k' k'' k''' -> RequesterData $ singletonTagMap k $ Entry $ IntMap.singleton k' $ IntMap.singleton k'' $ singletonRequesterData k''' v
105
95
106−mergeRequesterData :: RequesterData f -> RequesterData f -> RequesterData f
107−mergeRequesterData (RequesterData a) (RequesterData b) = RequesterData $ mergeTagMap a b
108−
109−mergeTagMap :: forall f. TagMap (Entry f) -> TagMap (Entry f) -> TagMap (Entry f)
110−mergeTagMap (TagMap m) (TagMap n) =
111− TagMap $ IntMap.unionWithKey (g' combiner) m n
112− where
113− combiner :: forall a. MyTag a -> Entry f a -> Entry f a -> Entry f a
114− combiner k (Entry a) (Entry b) = Entry $ case myKeyType k of
115− MyTagType_Single -> a
116− MyTagType_Multi -> IntMap.unionWith mergeRequesterData a b
117− MyTagType_Multi2 -> case _multi2Contents_dict a of
118− Dict -> Multi2Contents
119− { _multi2Contents_values = Map.unionWith (IntMap.unionWith mergeRequesterData) (_multi2Contents_values a) (_multi2Contents_values b)
120− , _multi2Contents_dict = Dict
121− }
122− MyTagType_Multi3 -> IntMap.unionWith (IntMap.unionWith mergeRequesterData) a b
123− g' :: (forall a. MyTag a -> Entry f a -> Entry f a -> Entry f a) -> Int -> Any -> Any -> Any
124− g' f rawKey a b =
125− let k = MyTag rawKey :: MyTag a
126− fromAny :: Any -> Entry f a
127− fromAny = unsafeCoerce
128− toAny :: Entry f a -> Any
129− toAny = unsafeCoerce
130− in toAny $ f k (fromAny a) (fromAny b)
131−
132requesterDataToList :: RequesterData f -> [DSum RequesterDataKey f]
96requesterDataToList :: RequesterData f -> [DSum RequesterDataKey f]
133requesterDataToList (RequesterData m) = do
97requesterDataToList (RequesterData m) = do
134 k :=> Entry e <- tagMapToList m
98 k :=> Entry e <- tagMapToList m
@@ -138,12 +102,11 @@ requesterDataToList (RequesterData m) = do
138 (k', e') <- IntMap.toList e
102 (k', e') <- IntMap.toList e
139 k'' :=> e'' <- requesterDataToList e'
103 k'' :=> e'' <- requesterDataToList e'
140 return $ RequesterDataKey_Multi k k' k'' :=> e''
104 return $ RequesterDataKey_Multi k k' k'' :=> e''
141− MyTagType_Multi2 -> case _multi2Contents_dict e of
105+ MyTagType_Multi2 -> do
142− Dict -> do
143− (k', e') <- Map.toList $ _multi2Contents_values e
106+ (k', e') <- Map.toList e
144− (k'', e'') <- IntMap.toList e'
107+ (k'', e'') <- IntMap.toList e'
145− k''' :=> e''' <- requesterDataToList e''
108+ k''' :=> e''' <- requesterDataToList e''
146− return $ RequesterDataKey_Multi2 k k' k'' k''' :=> e'''
109+ return $ RequesterDataKey_Multi2 k k' k'' k''' :=> e'''
147 MyTagType_Multi3 -> do
110 MyTagType_Multi3 -> do
148 (k', e') <- IntMap.toList e
111 (k', e') <- IntMap.toList e
149 (k'', e'') <- IntMap.toList e'
112 (k'', e'') <- IntMap.toList e'
@@ -171,13 +134,7 @@ traverseRequesterData f (RequesterData m) = RequesterData <$> traverseTagMapWith
171 go k (Entry request) = Entry <$> case myKeyType k of
134 go k (Entry request) = Entry <$> case myKeyType k of
172 MyTagType_Single -> f request
135 MyTagType_Single -> f request
173 MyTagType_Multi -> traverse (traverseRequesterData f) request
136 MyTagType_Multi -> traverse (traverseRequesterData f) request
174− MyTagType_Multi2 -> case request of
175− Multi2Contents { _multi2Contents_values = request', _multi2Contents_dict = Dict } -> do
176− v <- traverse (traverse (traverseRequesterData f)) request'
137+ MyTagType_Multi2 -> traverse (traverse (traverseRequesterData f)) request
177− pure $ Multi2Contents
178− { _multi2Contents_values = v
179− , _multi2Contents_dict = Dict
180− }
181 MyTagType_Multi3 -> traverse (traverse (traverseRequesterData f)) request
138 MyTagType_Multi3 -> traverse (traverse (traverseRequesterData f)) request
182
139
183-- | 'traverseRequesterData' with its arguments flipped
140-- | 'traverseRequesterData' with its arguments flipped
@@ -221,14 +178,9 @@ instance MyTagTypeOffset Multi3 where
221type family EntryContents request a where
178type family EntryContents request a where
222 EntryContents request (Single a) = request a
179 EntryContents request (Single a) = request a
223 EntryContents request Multi = IntMap (RequesterData request)
180 EntryContents request Multi = IntMap (RequesterData request)
224− EntryContents request (Multi2 k) = Multi2Contents k request
181+ EntryContents request (Multi2 k) = Map (Some k) (IntMap (RequesterData request))
225 EntryContents request Multi3 = IntMap (IntMap (RequesterData request))
182 EntryContents request Multi3 = IntMap (IntMap (RequesterData request))
226
183
227−data Multi2Contents k request = Multi2Contents
228− { _multi2Contents_dict :: {-# UNPACK #-} !(Dict (GCompare k)) -- This is a Dict instead of an existential context because we only want to use it in certain circumstances
229− , _multi2Contents_values :: {-# UNPACK #-} !(Map (Some k) (IntMap (RequesterData request)))
230− }
231−
232newtype Entry request x = Entry { unEntry :: EntryContents request x }
184newtype Entry request x = Entry { unEntry :: EntryContents request x }
233
185
234{-# INLINE singleEntry #-}
186{-# INLINE singleEntry #-}
@@ -357,7 +309,7 @@ tagRequest req = do
357 return t
309 return t
358
310
359{-# INLINE responseFromTag #-}
311{-# INLINE responseFromTag #-}
360−responseFromTag :: forall m t request response x. Monad m => MyTagWrap response (Entry response x) -> RequesterT t request response m (Event t (Entry response x))
312+responseFromTag :: Monad m => MyTagWrap response (Entry response x) -> RequesterT t request response m (Event t (Entry response x))
361responseFromTag (MyTagWrap t) = do
313responseFromTag (MyTagWrap t) = do
362 responses :: EventSelectorInt t Any <- RequesterT ask
314 responses :: EventSelectorInt t Any <- RequesterT ask
363 return $ (unsafeCoerce :: Event t Any -> Event t (Entry response x)) $ selectInt responses t
315 return $ (unsafeCoerce :: Event t Any -> Event t (Entry response x)) $ selectInt responses t
@@ -365,9 +317,6 @@ responseFromTag (MyTagWrap t) = do
365instance MonadTrans (RequesterT t request response) where
317instance MonadTrans (RequesterT t request response) where
366 lift = RequesterT . lift . lift
318 lift = RequesterT . lift . lift
367
319
368−instance MFunctor (RequesterT t request response) where
369− hoist f = RequesterT . hoist (hoist f) . unRequesterT
370−
371instance PerformEvent t m => PerformEvent t (RequesterT t request response m) where
320instance PerformEvent t m => PerformEvent t (RequesterT t request response m) where
372 type Performable (RequesterT t request response m) = Performable m
321 type Performable (RequesterT t request response m) = Performable m
373 performEvent_ = lift . performEvent_
322 performEvent_ = lift . performEvent_
@@ -487,9 +436,9 @@ traverseDMapWithKeyWithAdjustRequesterTWith base mapPatch weakenPatchWith patchN
487 let responses :: EventSelector t (Const2 (Some k) (IntMap (RequesterData response)))
436 let responses :: EventSelector t (Const2 (Some k) (IntMap (RequesterData response)))
488 responses = fanMap $ fmapCheap unpack response
437 responses = fanMap $ fmapCheap unpack response
489 unpack :: Entry response (Multi2 k) -> Map (Some k) (IntMap (RequesterData response))
438 unpack :: Entry response (Multi2 k) -> Map (Some k) (IntMap (RequesterData response))
490− unpack = _multi2Contents_values . unEntry
439+ unpack = unEntry
491 pack :: Map (Some k) (IntMap (RequesterData request)) -> Entry request (Multi2 k)
440 pack :: Map (Some k) (IntMap (RequesterData request)) -> Entry request (Multi2 k)
492− pack m = Entry $ Multi2Contents { _multi2Contents_values = m, _multi2Contents_dict = Dict }
441+ pack = Entry
493 f' :: forall a. k a -> Compose ((,) Int) v a -> m (Compose ((,) (Event t (IntMap (RequesterData request)))) v' a)
442 f' :: forall a. k a -> Compose ((,) Int) v a -> m (Compose ((,) (Event t (IntMap (RequesterData request)))) v' a)
494 f' k (Compose (n, v)) = do
443 f' k (Compose (n, v)) = do
495 (result, myRequests) <- runRequesterT (f k v) $ mapMaybeCheap (IntMap.lookup n) $ select responses (Const2 (Some k))
444 (result, myRequests) <- runRequesterT (f k v) $ mapMaybeCheap (IntMap.lookup n) $ select responses (Const2 (Some k))
@@ -510,30 +459,10 @@ traverseDMapWithKeyWithAdjustRequesterTWith base mapPatch weakenPatchWith patchN
510data Decoder rawResponse response =
459data Decoder rawResponse response =
511 forall a. Decoder (RequesterDataKey a) (rawResponse -> response a)
460 forall a. Decoder (RequesterDataKey a) (rawResponse -> response a)
512
461
513−matchResponsesWithRequests
514− :: forall t rawRequest rawResponse request response m.
515− ( MonadFix m
516− , MonadHold t m
517− , Reflex t
518− )
519− => (forall a. request a -> (rawRequest, rawResponse -> response a))
520− -- ^ Given a request (from 'Requester'), produces the wire format of the
521− -- request and a function used to process the associated response
522− -> Event t (RequesterData request)
523− -- ^ The outgoing requests
524− -> Event t (Int, rawResponse)
525− -- ^ The incoming responses, tagged by an identifying key
526− -> m ( Event t (Map Int rawRequest)
527− , Event t (RequesterData response)
528− )
529− -- ^ A map of outgoing wire-format requests and an event of responses keyed
530− -- by the 'RequesterData' key of the associated outgoing request
531−matchResponsesWithRequests f send recv = matchResponseMapWithRequests f send $ uncurry Map.singleton <$> recv
532−
533-- | Matches incoming responses with previously-sent requests
462-- | Matches incoming responses with previously-sent requests
534-- and uses the provided request "decoder" function to process
463-- and uses the provided request "decoder" function to process
535-- incoming responses.
464-- incoming responses.
536−matchResponseMapWithRequests
465+matchResponsesWithRequests
537 :: forall t rawRequest rawResponse request response m.
466 :: forall t rawRequest rawResponse request response m.
538 ( MonadFix m
467 ( MonadFix m
539 , MonadHold t m
468 , MonadHold t m
@@ -544,14 +473,14 @@ matchResponseMapWithRequests
544 -- request and a function used to process the associated response
473 -- request and a function used to process the associated response
545 -> Event t (RequesterData request)
474 -> Event t (RequesterData request)
546 -- ^ The outgoing requests
475 -- ^ The outgoing requests
547− -> Event t (Map Int rawResponse)
476+ -> Event t (Int, rawResponse)
548− -- ^ A map of incoming responses, tagged by an identifying key
477+ -- ^ The incoming responses, tagged by an identifying key
549 -> m ( Event t (Map Int rawRequest)
478 -> m ( Event t (Map Int rawRequest)
550 , Event t (RequesterData response)
479 , Event t (RequesterData response)
551 )
480 )
552 -- ^ A map of outgoing wire-format requests and an event of responses keyed
481 -- ^ A map of outgoing wire-format requests and an event of responses keyed
553 -- by the 'RequesterData' key of the associated outgoing request
482 -- by the 'RequesterData' key of the associated outgoing request
554−matchResponseMapWithRequests f send recv = do
483+matchResponsesWithRequests f send recv = do
555 rec nextId <- hold 1 $ fmap (\(next, _, _) -> next) outgoing
484 rec nextId <- hold 1 $ fmap (\(next, _, _) -> next) outgoing
556 waitingFor :: Incremental t (PatchMap Int (Decoder rawResponse response)) <-
485 waitingFor :: Incremental t (PatchMap Int (Decoder rawResponse response)) <-
557 holdIncremental mempty $ leftmost
486 holdIncremental mempty $ leftmost
@@ -593,15 +522,17 @@ matchResponseMapWithRequests f send recv = do
593 processIncoming
522 processIncoming
594 :: Incremental t (PatchMap Int (Decoder rawResponse response))
523 :: Incremental t (PatchMap Int (Decoder rawResponse response))
595 -- A map of outstanding expected responses
524 -- A map of outstanding expected responses
596− -> Event t (Map Int rawResponse)
525+ -> Event t (Int, rawResponse)
597 -- A incoming response paired with its identifying key
526 -- A incoming response paired with its identifying key
598 -> Event t (RequesterData response, PatchMap Int v)
527 -> Event t (RequesterData response, PatchMap Int v)
599 -- The decoded response and a patch that clears the outstanding responses queue
528 -- The decoded response and a patch that clears the outstanding responses queue
600− processIncoming waitingFor inc = flip push inc $ \rspMap -> do
529+ processIncoming waitingFor inc = flip push inc $ \(n, rawRsp) -> do
601 wf <- sample $ currentIncremental waitingFor
530 wf <- sample $ currentIncremental waitingFor
602− let match rawRsp (Decoder k rspF) =
531+ case Map.lookup n wf of
603− let rsp = rspF rawRsp
532+ Nothing -> return Nothing -- TODO How should lookup failures be handled here? They shouldn't ever happen..
604− in singletonRequesterData k rsp
533+ Just (Decoder k rspF) -> do
605− matches = Map.intersectionWith match rspMap wf
534+ let rsp = rspF rawRsp
606− pure $ if Map.null matches then Nothing else Just
535+ return $ Just
607− (Map.foldl' mergeRequesterData emptyRequesterData matches, PatchMap $ Nothing <$ matches)
536+ ( singletonRequesterData k rsp
537+ , PatchMap $ Map.singleton n Nothing
538+ )
src/Reflex/Spider/Internal.hs+1−36
@@ -307,20 +307,7 @@ data CacheSubscribed x a
307#endif
307#endif
308 }
308 }
309
309
310−nowSpiderEventM :: (HasSpiderTimeline x) => EventM x (R.Event (SpiderTimeline x) ())
310+
311−nowSpiderEventM =
312− SpiderEvent <$> now
313−
314−now :: (MonadIO m, Defer (Some Clear) m, HasSpiderTimeline x
315− ) => m (Event x ())
316−now = do
317− nowOrNot <- liftIO $ newIORef $ Just ()
318− scheduleClear nowOrNot
319− return . Event $ \_ -> do
320− occ <- liftIO . readIORef $ nowOrNot
321− return ( EventSubscription (return ()) eventSubscribedNow
322− , occ
323− )
324
311
325-- | Construct an 'Event' whose value is guaranteed not to be recomputed
312-- | Construct an 'Event' whose value is guaranteed not to be recomputed
326-- repeatedly
313-- repeatedly
@@ -607,16 +594,6 @@ eventSubscribedNever = EventSubscribed
607 , eventSubscribedWhoCreated = return ["never"]
594 , eventSubscribedWhoCreated = return ["never"]
608#endif
595#endif
609 }
596 }
610−eventSubscribedNow :: EventSubscribed x
611−eventSubscribedNow = EventSubscribed
612− { eventSubscribedHeightRef = zeroRef
613− , eventSubscribedRetained = toAny ()
614−#ifdef DEBUG_CYCLES
615− , eventSubscribedGetParents = return []
616− , eventSubscribedHasOwnHeightRef = False
617− , eventSubscribedWhoCreated = return ["now"]
618−#endif
619− }
620
597
621eventSubscribedFan :: FanSubscribed x k v -> EventSubscribed x
598eventSubscribedFan :: FanSubscribed x k v -> EventSubscribed x
622eventSubscribedFan !subscribed = EventSubscribed
599eventSubscribedFan !subscribed = EventSubscribed
@@ -2520,8 +2497,6 @@ instance HasSpiderTimeline x => Reflex.Class.MonadHold (SpiderTimeline x) (Event
2520 {-# INLINABLE headE #-}
2497 {-# INLINABLE headE #-}
2521 headE = R.slowHeadE
2498 headE = R.slowHeadE
2522-- headE (SpiderEvent e) = SpiderEvent <$> Reflex.Spider.Internal.headE e
2499-- headE (SpiderEvent e) = SpiderEvent <$> Reflex.Spider.Internal.headE e
2523− {-# INLINABLE now #-}
2524− now = nowSpiderEventM
2525
2500
2526instance Reflex.Class.MonadSample (SpiderTimeline x) (SpiderPullM x) where
2501instance Reflex.Class.MonadSample (SpiderTimeline x) (SpiderPullM x) where
2527 {-# INLINABLE sample #-}
2502 {-# INLINABLE sample #-}
@@ -2543,9 +2518,6 @@ instance HasSpiderTimeline x => Reflex.Class.MonadHold (SpiderTimeline x) (Spide
2543 {-# INLINABLE headE #-}
2518 {-# INLINABLE headE #-}
2544 headE = R.slowHeadE
2519 headE = R.slowHeadE
2545-- headE (SpiderEvent e) = SpiderPushM $ SpiderEvent <$> Reflex.Spider.Internal.headE e
2520-- headE (SpiderEvent e) = SpiderPushM $ SpiderEvent <$> Reflex.Spider.Internal.headE e
2546− {-# INLINABLE now #-}
2547− now = SpiderPushM nowSpiderEventM
2548−
2549
2521
2550instance HasSpiderTimeline x => Monad (Reflex.Class.Dynamic (SpiderTimeline x)) where
2522instance HasSpiderTimeline x => Monad (Reflex.Class.Dynamic (SpiderTimeline x)) where
2551 {-# INLINE return #-}
2523 {-# INLINE return #-}
@@ -2609,9 +2581,6 @@ instance HasSpiderTimeline x => Reflex.Class.MonadHold (SpiderTimeline x) (Spide
2609 buildDynamic getV0 e = runFrame . runSpiderHostFrame $ Reflex.Class.buildDynamic getV0 e
2581 buildDynamic getV0 e = runFrame . runSpiderHostFrame $ Reflex.Class.buildDynamic getV0 e
2610 {-# INLINABLE headE #-}
2582 {-# INLINABLE headE #-}
2611 headE e = runFrame . runSpiderHostFrame $ Reflex.Class.headE e
2583 headE e = runFrame . runSpiderHostFrame $ Reflex.Class.headE e
2612− {-# INLINABLE now #-}
2613− now = runFrame . runSpiderHostFrame $ Reflex.Class.now
2614−
2615
2584
2616instance HasSpiderTimeline x => Reflex.Class.MonadSample (SpiderTimeline x) (SpiderHostFrame x) where
2585instance HasSpiderTimeline x => Reflex.Class.MonadSample (SpiderTimeline x) (SpiderHostFrame x) where
2617 sample = SpiderHostFrame . readBehaviorUntracked . unSpiderBehavior --TODO: This can cause problems with laziness, so we should get rid of it if we can
2586 sample = SpiderHostFrame . readBehaviorUntracked . unSpiderBehavior --TODO: This can cause problems with laziness, so we should get rid of it if we can
@@ -2628,8 +2597,6 @@ instance HasSpiderTimeline x => Reflex.Class.MonadHold (SpiderTimeline x) (Spide
2628 {-# INLINABLE headE #-}
2597 {-# INLINABLE headE #-}
2629 headE = R.slowHeadE
2598 headE = R.slowHeadE
2630-- headE (SpiderEvent e) = SpiderHostFrame $ SpiderEvent <$> Reflex.Spider.Internal.headE e
2599-- headE (SpiderEvent e) = SpiderHostFrame $ SpiderEvent <$> Reflex.Spider.Internal.headE e
2631− {-# INLINABLE now #-}
2632− now = SpiderHostFrame Reflex.Class.now
2633
2600
2634instance HasSpiderTimeline x => Reflex.Class.MonadSample (SpiderTimeline x) (SpiderHost x) where
2601instance HasSpiderTimeline x => Reflex.Class.MonadSample (SpiderTimeline x) (SpiderHost x) where
2635 {-# INLINABLE sample #-}
2602 {-# INLINABLE sample #-}
@@ -2650,8 +2617,6 @@ instance HasSpiderTimeline x => Reflex.Class.MonadHold (SpiderTimeline x) (Refle
2650 buildDynamic getV0 e = Reflex.Spider.Internal.ReadPhase $ Reflex.Class.buildDynamic getV0 e
2617 buildDynamic getV0 e = Reflex.Spider.Internal.ReadPhase $ Reflex.Class.buildDynamic getV0 e
2651 {-# INLINABLE headE #-}
2618 {-# INLINABLE headE #-}
2652 headE e = Reflex.Spider.Internal.ReadPhase $ Reflex.Class.headE e
2619 headE e = Reflex.Spider.Internal.ReadPhase $ Reflex.Class.headE e
2653− {-# INLINABLE now #-}
2654− now = Reflex.Spider.Internal.ReadPhase Reflex.Class.now
2655
2620
2656--------------------------------------------------------------------------------
2621--------------------------------------------------------------------------------
2657-- Deprecated items
2622-- Deprecated items
src/Reflex/TriggerEvent/Base.hs−2
@@ -122,8 +122,6 @@ instance MonadHold t m => MonadHold t (TriggerEventT t m) where
122 buildDynamic a0 = lift . buildDynamic a0
122 buildDynamic a0 = lift . buildDynamic a0
123 {-# INLINABLE headE #-}
123 {-# INLINABLE headE #-}
124 headE = lift . headE
124 headE = lift . headE
125− {-# INLINABLE now #-}
126− now = lift now
127
125
128instance Adjustable t m => Adjustable t (TriggerEventT t m) where
126instance Adjustable t m => Adjustable t (TriggerEventT t m) where
129 {-# INLINABLE runWithReplace #-}
127 {-# INLINABLE runWithReplace #-}
test/Headless.hsdeleted−10
@@ -1,10 +0,0 @@
1−module Main where
2−
3−import Reflex
4−import Reflex.Host.Headless (runHeadlessApp)
5−
6−main :: IO ()
7−main = do
8− runHeadlessApp $ do
9− pb <- getPostBuild
10− performEvent (pure <$> pb)
test/Reflex/Plan/Pure.hs−1
@@ -41,7 +41,6 @@ instance MonadHold (Pure Int) PurePlan where
41 holdIncremental initial = liftPlan . holdIncremental initial
41 holdIncremental initial = liftPlan . holdIncremental initial
42 buildDynamic getInitial = liftPlan . buildDynamic getInitial
42 buildDynamic getInitial = liftPlan . buildDynamic getInitial
43 headE = liftPlan . headE
43 headE = liftPlan . headE
44− now = liftPlan now
45
44
46instance MonadSample (Pure Int) PurePlan where
45instance MonadSample (Pure Int) PurePlan where
47 sample = liftPlan . sample
46 sample = liftPlan . sample
test/Reflex/Test/Micro.hs+2−8
@@ -322,14 +322,8 @@ testCases =
322 let e = never <$ switch b
322 let e = never <$ switch b
323 return $ void e
323 return $ void e
324 lazyHold
324 lazyHold
325− , testE "now-1" $ do
325+
326− e1 <- events1
326+
327− switchHoldPromptly never . pushAlways (\a -> fmap (a <$) now) $ e1
328− , testE "now-2" $ do
329− e1 <- events1
330− let e = pushAlways (\a -> if a == "a" then now else return never) e1
331− x <- accumDyn (<>) never e
332− return . coincidence $ updated x
333 ] where
327 ] where
334
328
335 events1, events2, events3 :: TestPlan t m => m (Event t String)
329 events1, events2, events3 :: TestPlan t m => m (Event t String)