on develop help sign in
Merge branch 'develop' into runhost
b2009f3John Ericson
.travis.yml+3−1
@@ -29,6 +29,8 @@ matrix:
29 include:
29 include:
30 - compiler: ghcjs-8.4
30 - compiler: ghcjs-8.4
31 addons: {"apt":{"sources":["hvr-ghc"],"packages":["cabal-install-3.0"]}}
31 addons: {"apt":{"sources":["hvr-ghc"],"packages":["cabal-install-3.0"]}}
32+ - compiler: ghc-8.8.1
33+ addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.8.1","cabal-install-3.0"]}}
32 - compiler: ghc-8.6.5
34 - compiler: ghc-8.6.5
33 addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-2.4"]}}
35 addons: {"apt":{"sources":["hvr-ghc"],"packages":["ghc-8.6.5","cabal-install-2.4"]}}
34 - compiler: ghc-8.4.4
36 - compiler: ghc-8.4.4
@@ -163,7 +165,7 @@ script:
163 # Constraint set no-th
165 # Constraint set no-th
164 - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='reflex -use-template-haskell' all | color_cabal_output
166 - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='reflex -use-template-haskell' all | color_cabal_output
165 # Constraint set old-these
167 # Constraint set old-these
166− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='these <1' all | color_cabal_output
168+ - if $GHCJS || ! $GHCJS && [ $HCNUMVER -lt 80800 ] ; then ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='these <1' all | color_cabal_output ; fi
167 # Constraint set old-witherable
169 # Constraint set old-witherable
168 - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='witherable <0.3.2' all | color_cabal_output
170 - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --constraint='witherable <0.3.2' all | color_cabal_output
169
171
ChangeLog.md+30−7
@@ -2,9 +2,20 @@
2
2
3## Unreleased
3## Unreleased
4
4
5+* Support GHC 8.8
6+
7+* Add `Reflex.Query.Base.mapQueryT`. See that module for documentation
8+
9+## 0.6.3
10+
5−* Data.WeakBag.traverse and Data.FastWeakBag.traverse have been
11+* `Data.WeakBag.traverse` and `Data.FastWeakBag.traverse` have been deprecated.
6− renamed to Data.WeakBag.traverse_ and Data.FastWeakBag.traverse_
12+ They are replaced with `Data.WeakBag.traverse_` and `Data.FastWeakBag.traverse_`, respectively.
7− respectively.
13+
14+* Fixes a bug in `Reflex.Patch.MapWithMove.patchThatSortsMapWith` that was producing invalid `PatchMapWithMove`.
15+
16+* Add missing `NotReady` instances:
17+ - `instance NotReady (SpiderTimeline x) (SpiderHost x)`
18+ - `instance HasSpiderTimeline x => NotReady (SpiderTimeline x) (PerformEventT (SpiderTimeline x) (SpiderHost x))`
8
19
9## 0.6.2.4
20## 0.6.2.4
10
21
@@ -17,7 +28,9 @@
17## 0.6.2.2
28## 0.6.2.2
18
29
19* Support these >= 1. Add `split-these` flag to control whether to use new these/semialign combination or not.
30* Support these >= 1. Add `split-these` flag to control whether to use new these/semialign combination or not.
31+
20* Update version bounds to fix some CI failures
32* Update version bounds to fix some CI failures
33+
21* Add travis CI configuration
34* Add travis CI configuration
22
35
23## 0.6.2.1
36## 0.6.2.1
@@ -32,32 +45,42 @@
32 * Add incrementalCoercion/coerceIncremental to go with dynamicCoercion/coerceDynamic
45 * Add incrementalCoercion/coerceIncremental to go with dynamicCoercion/coerceDynamic
33
46
34* Generalize merging functions:
47* Generalize merging functions:
35− `merge` to `mergeG`,
48+ `merge` to `mergeG`,
36− `mergeIncremental` to `mergeIncrementalG`,
49+ `mergeIncremental` to `mergeIncrementalG`,
37− `mergeIncrementalWithMove` to `mergeIncrementalWithMoveG`.
50+ `mergeIncrementalWithMove` to `mergeIncrementalWithMoveG`.
38
51
39* Generalize distribute function:
52* Generalize distribute function:
40 `distributeDMapOverDynPure` to `distributeDMapOverDynPureG`,
53 `distributeDMapOverDynPure` to `distributeDMapOverDynPureG`,
41
54
42## 0.6.2.0
55## 0.6.2.0
43
56
44−* Fix `holdDyn` so that it is lazy in its event argument
57+* Fix `holdDyn` so that it is lazy in its event argument
45 These produce `DMap`s whose values needn't be `Identity`.
58 These produce `DMap`s whose values needn't be `Identity`.
59+
46* Stop using the now-deprecated `*Tag` classes (e.g., `ShowTag`).
60* Stop using the now-deprecated `*Tag` classes (e.g., `ShowTag`).
61+
47* Fix `holdDyn` so that it is lazy in its event argument.
62* Fix `holdDyn` so that it is lazy in its event argument.
48
63
49## 0.6.1.0
64## 0.6.1.0
50
65
51* Re-export all of `Data.Map.Monoidal`
66* Re-export all of `Data.Map.Monoidal`
67+
52* Fix `QueryT` and `RequesterT` tests
68* Fix `QueryT` and `RequesterT` tests
53
69
54## 0.6.0.0 -- 2019-03-20
70## 0.6.0.0 -- 2019-03-20
55
71
56* Deprecate `FunctorMaybe` in favor of `Data.Witherable.Filterable`. We still export `fmapMaybe`, `ffilter`, etc., but they all rely on `Filterable` now.
72* Deprecate `FunctorMaybe` in favor of `Data.Witherable.Filterable`. We still export `fmapMaybe`, `ffilter`, etc., but they all rely on `Filterable` now.
73+
57* Rename `MonadDynamicWriter` to `DynamicWriter` and add a deprecation for the old name.
74* Rename `MonadDynamicWriter` to `DynamicWriter` and add a deprecation for the old name.
75+
58* Remove many deprecated functions.
76* Remove many deprecated functions.
77+
59* Add a `Num` instance for `Dynamic`.
78* Add a `Num` instance for `Dynamic`.
79+
60* Add `matchRequestsWithResponses` to make it easier to use `Requester` with protocols that don't do this matching for you.
80* Add `matchRequestsWithResponses` to make it easier to use `Requester` with protocols that don't do this matching for you.
81+
61* Add `withRequesterT` to map functions over the request and response of a `RequesterT`.
82* Add `withRequesterT` to map functions over the request and response of a `RequesterT`.
83+
62* Suppress nil patches in `QueryT` as an optimization. The `Query` type must now have an `Eq` instance.
84* Suppress nil patches in `QueryT` as an optimization. The `Query` type must now have an `Eq` instance.
85+
63* Add `throttleBatchWithLag` to `Reflex.Time`. See that module for details.
86* Add `throttleBatchWithLag` to `Reflex.Time`. See that module for details.
Quickref.md+14−11
@@ -198,7 +198,7 @@ For Events, the returned Event fires whenever the latest Event supplied by the w
198The functions mentioned above are used to create a static FRP network.
198The functions mentioned above are used to create a static FRP network.
199There are additional typeclasses that can be used to modify the FRP network, to have it interact with IO action, or to introspect the building of the network.
199There are additional typeclasses that can be used to modify the FRP network, to have it interact with IO action, or to introspect the building of the network.
200
200
201−Th typeclasses and their associated annotations include:
201+The typeclasses and their associated annotations include:
202
202
203- `PostBuild`
203- `PostBuild`
204 Fire an Event when an FRP network has been set up.
204 Fire an Event when an FRP network has been set up.
@@ -206,7 +206,7 @@ Th typeclasses and their associated annotations include:
206 [B] -- Function runs in any monad supporting PostBuild
206 [B] -- Function runs in any monad supporting PostBuild
207 ```
207 ```
208
208
209−- `Adjustable`
209+- `Adjustable`
210 Use Events to add or remove pieces of an FRP network.
210 Use Events to add or remove pieces of an FRP network.
211 ```haskell
211 ```haskell
212 [A] -- Function runs in any monad supporting Adjustable
212 [A] -- Function runs in any monad supporting Adjustable
@@ -271,7 +271,7 @@ Th typeclasses and their associated annotations include:
271```haskell
271```haskell
272-- Run side-effecting actions in Event when it occurs; returned Event contains
272-- Run side-effecting actions in Event when it occurs; returned Event contains
273-- results. Side effects run in the (Performable m) monad which is associated with
273-- results. Side effects run in the (Performable m) monad which is associated with
274−-- the (PerformEvent t m) typeclass constraint.
274+-- the (PerformEvent t m) typeclass constraint.
275-- This allows for working with IO when a ((MonadIO (Performable m)) constraint is available.
275-- This allows for working with IO when a ((MonadIO (Performable m)) constraint is available.
276[P] performEvent :: Event (Performable m a ) -> m (Event a)
276[P] performEvent :: Event (Performable m a ) -> m (Event a)
277
277
@@ -295,17 +295,20 @@ Th typeclasses and their associated annotations include:
295## Networks
295## Networks
296
296
297```haskell
297```haskell
298−-- Functions from Reflex.Network used to deal with Dynamics/Events carrying (m a)
298+-- Functions from Reflex.Adjustable / Reflex.Network used to deal with Dynamics/Events carrying (m a)
299
299
300+[A] runWithReplace :: m a -> Event t (m b) -> m (a, Event t b)
301+
300−-- Given a Dynamic of network-creating actions, create a network that is recreated whenever the Dynamic updates.
302+-- Given a Dynamic of network-creating actions, create a network that is recreated whenever the Dynamic updates.
301−-- The returned Event of network results occurs when the Dynamic does. Note: Often, the type a is an Event,
303+-- The returned Event of network results occurs when the Dynamic does. Note: Often, the type a is an Event,
302-- in which case the return value is an Event-of-Events that would typically be flattened (via switchHold).
304-- in which case the return value is an Event-of-Events that would typically be flattened (via switchHold).
303−[P,A] networkView :: Dynamic (m a) -> m (Event a)
305+[P,A] networkView :: Dynamic (m a) -> m (Event a)
304
306
305−-- Given an initial network and an Event of network-creating actions, create a network that is recreated whenever the
307+-- Given an initial network and an Event of network-creating actions, create a network that is recreated whenever the
306−-- Event fires. The returned Dynamic of network results occurs when the Event does. Note: Often, the type a is an
308+-- Event fires. The returned Dynamic of network results occurs when the Event does. Note: Often, the type a is an
307-- Event, in which case the return value is a Dynamic-of-Events that would typically be flattened.
309-- Event, in which case the return value is a Dynamic-of-Events that would typically be flattened.
308−[H,A] networkHold :: m a -> Event (m a) -> m (Dynamic a)
310+[H,A] networkHold :: m a -> Event (m a) -> m (Dynamic a)
309
311
310-- Render a placeholder network to be shown while another network is not yet done building
312-- Render a placeholder network to be shown while another network is not yet done building
311−[P,A] untilReady :: m a -> m b -> m (a, Event b)
313+[P,A] untilReady :: m a -> m b -> m (a, Event b)
314+```
cabal.haskell-ci+1
@@ -10,6 +10,7 @@ constraint-set no-th
10 constraints: reflex -use-template-haskell
10 constraints: reflex -use-template-haskell
11
11
12constraint-set old-these
12constraint-set old-these
13+ ghc: <8.8
13 constraints: these <1
14 constraints: these <1
14
15
15constraint-set old-witherable
16constraint-set old-witherable
default.nixdeleted−49
@@ -1,49 +0,0 @@
1−{ mkDerivation, ghc, base, bifunctors, containers, deepseq
2−, dependent-map, dependent-sum, exception-transformers
3−, haskell-src-exts, haskell-src-meta, hlint, lens, MemoTrie
4−, monad-control, mtl, primitive, random, ref-tf
5−, semigroupoids , semigroups, split, stdenv, stm, syb
6−, template-haskell , these, time, transformers
7−, transformers-compat, unbounded-delays, prim-uniq
8−, data-default, filepath, directory, filemanip, ghcjs-base
9−, monoidal-containers, witherable, profunctors
10−, splitThese ? (semialign != null), semialign ? null, these-lens ? null
11−, useTemplateHaskell ? true
12−}:
13−mkDerivation {
14− pname = "reflex";
15− version = "0.6.2.4";
16− src = builtins.filterSource (path: type: !(builtins.elem (baseNameOf path) [
17− "default.nix"
18− "release.nix"
19− ".git"
20− "dist"
21− ])) ./.;
22− libraryHaskellDepends = [
23− base bifunctors containers dependent-map dependent-sum
24− exception-transformers lens
25− MemoTrie monad-control mtl primitive ref-tf semigroupoids
26− semigroups stm syb template-haskell these transformers
27− transformers-compat prim-uniq
28− base bifunctors containers deepseq dependent-map dependent-sum
29− mtl ref-tf split transformers data-default
30− random time unbounded-delays monoidal-containers witherable
31− profunctors
32− ] ++ (if ghc.isGhcjs or false then [
33− ghcjs-base
34− ] else []) ++ (if !useTemplateHaskell then [] else [
35− haskell-src-exts haskell-src-meta
36− ]) ++ (if splitThese then [
37− semialign
38− these-lens
39− ] else []);
40− testHaskellDepends = if ghc.isGhcjs or false then [] else [
41− hlint filepath directory filemanip
42− ];
43− configureFlags =
44− stdenv.lib.optional (!useTemplateHaskell) [ "-f-use-template-haskell" ] ++
45− stdenv.lib.optional (!splitThese) [ "-f-split-these" ];
46− homepage = "https://github.com/reflex-frp/reflex";
47− description = "Higher-order Functional Reactive Programming";
48− license = stdenv.lib.licenses.bsd3;
49−}
dep/reflex-platform/github.json+3−3
@@ -1,7 +1,7 @@
1{
1{
2 "owner": "reflex-frp",
2 "owner": "reflex-frp",
3 "repo": "reflex-platform",
3 "repo": "reflex-platform",
4− "branch": "jailbreakTheselens",
4+ "branch": "master",
5− "rev": "4284ed527c96c373538dc7e31776d9a50ca6aa91",
5+ "rev": "510b990d0b11f0626afbec5fe8575b5b2395391b",
6− "sha256": "1m1nkxq7ng9wnqbd77xn8d81f2iz8g61y5m0r3gp0gi0q59jm8ay"
6+ "sha256": "09cmahsbxr0963wq171c7j139iyzz49hramr4v9nsf684wcwkngv"
7}
7}
reflex.cabal+7−8
@@ -1,5 +1,5 @@
1Name: reflex
1Name: reflex
2−Version: 0.6.2.4
2+Version: 0.6.3
3Synopsis: Higher-order Functional Reactive Programming
3Synopsis: Higher-order Functional Reactive Programming
4Description: Reflex is a high-performance, deterministic, higher-order Functional Reactive Programming system
4Description: Reflex is a high-performance, deterministic, higher-order Functional Reactive Programming system
5License: BSD3
5License: BSD3
@@ -18,7 +18,7 @@ extra-source-files:
18 ChangeLog.md
18 ChangeLog.md
19
19
20tested-with:
20tested-with:
21− GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5,
21+ GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.1,
22 GHCJS ==8.4
22 GHCJS ==8.4
23
23
24flag use-reflex-optimizer
24flag use-reflex-optimizer
@@ -50,7 +50,7 @@ library
50 hs-source-dirs: src
50 hs-source-dirs: src
51 build-depends:
51 build-depends:
52 MemoTrie == 0.6.*,
52 MemoTrie == 0.6.*,
53− base >= 4.9 && < 4.13,
53+ base >= 4.9 && < 4.14,
54 bifunctors >= 5.2 && < 5.6,
54 bifunctors >= 5.2 && < 5.6,
55 comonad >= 5.0.4 && < 5.1,
55 comonad >= 5.0.4 && < 5.1,
56 constraints-extras >= 0.3 && < 0.4,
56 constraints-extras >= 0.3 && < 0.4,
@@ -58,20 +58,19 @@ library
58 data-default >= 0.5 && < 0.8,
58 data-default >= 0.5 && < 0.8,
59 dependent-map >= 0.3 && < 0.4,
59 dependent-map >= 0.3 && < 0.4,
60 exception-transformers == 0.4.*,
60 exception-transformers == 0.4.*,
61− profunctors >= 5.3 && < 5.5,
62 lens >= 4.7 && < 5,
61 lens >= 4.7 && < 5,
63 monad-control >= 1.0.1 && < 1.1,
62 monad-control >= 1.0.1 && < 1.1,
64 mtl >= 2.1 && < 2.3,
63 mtl >= 2.1 && < 2.3,
65 prim-uniq >= 0.1.0.1 && < 0.2,
64 prim-uniq >= 0.1.0.1 && < 0.2,
66 primitive >= 0.5 && < 0.8,
65 primitive >= 0.5 && < 0.8,
67− profunctors,
66+ profunctors >= 5.3 && < 5.6,
68 random == 1.1.*,
67 random == 1.1.*,
69 ref-tf == 0.4.*,
68 ref-tf == 0.4.*,
70 reflection == 2.1.*,
69 reflection == 2.1.*,
71 semigroupoids >= 4.0 && < 6,
70 semigroupoids >= 4.0 && < 6,
72 stm >= 2.4 && < 2.6,
71 stm >= 2.4 && < 2.6,
73 syb >= 0.5 && < 0.8,
72 syb >= 0.5 && < 0.8,
74− time >= 1.4 && < 1.9,
73+ time >= 1.4 && < 1.10,
75 transformers >= 0.5.6.0 && < 0.6,
74 transformers >= 0.5.6.0 && < 0.6,
76 unbounded-delays >= 0.1.0.0 && < 0.2,
75 unbounded-delays >= 0.1.0.0 && < 0.2,
77 witherable >= 0.3 && < 0.3.2
76 witherable >= 0.3 && < 0.3.2
@@ -152,9 +151,9 @@ library
152 cpp-options: -DUSE_TEMPLATE_HASKELL
151 cpp-options: -DUSE_TEMPLATE_HASKELL
153 build-depends:
152 build-depends:
154 dependent-sum >= 0.6 && < 0.7,
153 dependent-sum >= 0.6 && < 0.7,
155− haskell-src-exts >= 1.16 && < 1.22,
154+ haskell-src-exts >= 1.16 && < 1.23,
156 haskell-src-meta >= 0.6 && < 0.9,
155 haskell-src-meta >= 0.6 && < 0.9,
157− template-haskell >= 2.9 && < 2.15
156+ template-haskell >= 2.9 && < 2.16
158 exposed-modules:
157 exposed-modules:
159 Reflex.Dynamic.TH
158 Reflex.Dynamic.TH
160 other-extensions: TemplateHaskell
159 other-extensions: TemplateHaskell
release.nix+30−10
@@ -17,19 +17,39 @@ let
17 ] ++ lib.optionals (reflex-platform.iosSupport) [
17 ] ++ lib.optionals (reflex-platform.iosSupport) [
18 "ghcIosAarch64"
18 "ghcIosAarch64"
19 ];
19 ];
20+ variations = map (v: "reflex" + v) [
21+ "-dontUseTemplateHaskell"
22+ ""
23+ ];
20− hsPkgs = lib.genAttrs compilers (ghc: let
24+ compilerPkgs = lib.genAttrs compilers (ghc: let
21− ghc' = reflex-platform.${ghc}.override {
25+ variationPkgs = lib.genAttrs variations (variation: let
26+ reflex-platform = reflex-platform-fun {
27+ inherit system;
28+ __useTemplateHaskell = variation == "reflex"; # TODO hack
29+ haskellOverlays = [
30+ # Use this package's source for reflex
22− overrides = self: super: {
31+ (self: super: {
23− reflex-dontUseTemplateHaskell = self.callPackage ./. { useTemplateHaskell = false; };
32+ _dep = super._dep // {
24− reflex = self.callPackage ./. { useTemplateHaskell = true; };
33+ reflex = builtins.filterSource (path: type: !(builtins.elem (baseNameOf path) [
34+ "release.nix"
35+ ".git"
36+ "dist"
37+ "cabal.haskell-ci"
38+ "cabal.project"
39+ ".travis.yml"
40+ ])) ./.;
41+ };
42+ })
43+ ];
25 };
44 };
26− };
45+ in reflex-platform.${ghc}.reflex);
27− in {
46+ in variationPkgs // {
28− inherit (ghc') reflex reflex-dontUseTemplateHaskell;
47+ cache = reflex-platform.pinBuildInputs "reflex-${system}-${ghc}"
48+ (builtins.attrValues variationPkgs);
29 });
49 });
30− in hsPkgs // {
50+ in compilerPkgs // {
31 cache = reflex-platform.pinBuildInputs "reflex-${system}"
51 cache = reflex-platform.pinBuildInputs "reflex-${system}"
32− (lib.concatLists (map builtins.attrValues (builtins.attrValues hsPkgs)));
52+ (map (a: a.cache) (builtins.attrValues compilerPkgs));
33 });
53 });
34
54
35 metaCache = native-reflex-platform.pinBuildInputs "reflex-everywhere"
55 metaCache = native-reflex-platform.pinBuildInputs "reflex-everywhere"
src/Control/Monad/ReaderIO.hs+1−1
@@ -37,7 +37,7 @@ instance Applicative (ReaderIO e) where
37#if MIN_VERSION_base(4,10,0)
37#if MIN_VERSION_base(4,10,0)
38 liftA2 = liftM2
38 liftA2 = liftM2
39 {-# INLINE liftA2 #-}
39 {-# INLINE liftA2 #-}
40−#endif
40+#endif
41 (*>) = (>>)
41 (*>) = (>>)
42 {-# INLINE (*>) #-}
42 {-# INLINE (*>) #-}
43
43
src/Data/AppendMap.hs+1−1
@@ -20,7 +20,7 @@ module Data.AppendMap
20 , module Data.Map.Monoidal
20 , module Data.Map.Monoidal
21 ) where
21 ) where
22
22
23−import Prelude hiding (map, null)
23+import Prelude hiding (null)
24
24
25import Data.Coerce
25import Data.Coerce
26import Data.Default
26import Data.Default
src/Data/Functor/Misc.hs+1
@@ -53,6 +53,7 @@ import Data.Map (Map)
53import qualified Data.Map as Map
53import qualified Data.Map as Map
54import Data.Some (Some(Some))
54import Data.Some (Some(Some))
55import Data.These
55import Data.These
56+import Data.Type.Equality ((:~:)(Refl))
56import Data.Typeable hiding (Refl)
57import Data.Typeable hiding (Refl)
57
58
58--------------------------------------------------------------------------------
59--------------------------------------------------------------------------------
src/Reflex/Class.hs+6−2
@@ -200,7 +200,7 @@ import Data.Dependent.Map (DMap, DSum (..))
200import qualified Data.Dependent.Map as DMap
200import qualified Data.Dependent.Map as DMap
201import Data.Functor.Compose
201import Data.Functor.Compose
202import Data.Functor.Product
202import Data.Functor.Product
203−import Data.GADT.Compare (GEq (..), GCompare (..), (:~:) (..))
203+import Data.GADT.Compare (GEq (..), GCompare (..))
204import Data.FastMutableIntMap (PatchIntMap)
204import Data.FastMutableIntMap (PatchIntMap)
205import Data.Foldable
205import Data.Foldable
206import Data.Functor.Bind
206import Data.Functor.Bind
@@ -215,6 +215,7 @@ import Data.Some (Some(Some))
215import Data.String
215import Data.String
216import Data.These
216import Data.These
217import Data.Type.Coercion
217import Data.Type.Coercion
218+import Data.Type.Equality ((:~:) (..))
218import Data.Witherable (Filterable(..))
219import Data.Witherable (Filterable(..))
219import qualified Data.Witherable as W
220import qualified Data.Witherable as W
220import Reflex.FunctorMaybe (FunctorMaybe)
221import Reflex.FunctorMaybe (FunctorMaybe)
@@ -286,7 +287,8 @@ class ( MonadHold t (PushM t)
286 -- | Create an 'Event' that will occur whenever the currently-selected input
287 -- | Create an 'Event' that will occur whenever the currently-selected input
287 -- 'Event' occurs
288 -- 'Event' occurs
288 switch :: Behavior t (Event t a) -> Event t a
289 switch :: Behavior t (Event t a) -> Event t a
289− -- | Create an 'Event' that will occur whenever the input event is occurring -- and its occurrence value, another 'Event', is also occurring
290+ -- | Create an 'Event' that will occur whenever the input event is occurring -- and its occurrence value, another 'Event', is also occurring.
291+ -- You maybe looking for '@switchHold@ @never@' instead.
290 coincidence :: Event t (Event t a) -> Event t a
292 coincidence :: Event t (Event t a) -> Event t a
291 -- | Extract the 'Behavior' of a 'Dynamic'.
293 -- | Extract the 'Behavior' of a 'Dynamic'.
292 current :: Dynamic t a -> Behavior t a
294 current :: Dynamic t a -> Behavior t a
@@ -662,7 +664,9 @@ instance Reflex t => Monad (Behavior t) where
662 a >>= f = pull $ sample a >>= sample . f
664 a >>= f = pull $ sample a >>= sample . f
663 -- Note: it is tempting to write (_ >> b = b); however, this would result in (fail x >> return y) succeeding (returning y), which violates the law that (a >> b = a >>= \_ -> b), since the implementation of (>>=) above actually will fail. Since we can't examine 'Behavior's other than by using sample, I don't think it's possible to write (>>) to be more efficient than the (>>=) above.
665 -- Note: it is tempting to write (_ >> b = b); however, this would result in (fail x >> return y) succeeding (returning y), which violates the law that (a >> b = a >>= \_ -> b), since the implementation of (>>=) above actually will fail. Since we can't examine 'Behavior's other than by using sample, I don't think it's possible to write (>>) to be more efficient than the (>>=) above.
664 return = constant
666 return = constant
667+#if !MIN_VERSION_base(4,13,0)
665 fail = error "Monad (Behavior t) does not support fail"
668 fail = error "Monad (Behavior t) does not support fail"
669+#endif
666
670
667instance (Reflex t, Monoid a) => Monoid (Behavior t a) where
671instance (Reflex t, Monoid a) => Monoid (Behavior t a) where
668 mempty = constant mempty
672 mempty = constant mempty
src/Reflex/Collection.hs+1−1
@@ -130,7 +130,7 @@ listWithKeyShallowDiff initialVals valsChanged mkChild = do
130 Nothing -> Just Nothing
130 Nothing -> Just Nothing
131
131
132 -- We don't want to let spurious re-creations of items through
132 -- We don't want to let spurious re-creations of items through
133− Just _ -> Nothing
133+ Just _ -> Nothing
134 listHoldWithKey
134 listHoldWithKey
135 initialVals
135 initialVals
136 (attachWith (flip (Map.differenceWith relevantPatch))
136 (attachWith (flip (Map.differenceWith relevantPatch))
src/Reflex/Dynamic.hs+2−1
@@ -87,11 +87,12 @@ import Data.Align
87import Data.Dependent.Map (DMap)
87import Data.Dependent.Map (DMap)
88import qualified Data.Dependent.Map as DMap
88import qualified Data.Dependent.Map as DMap
89import Data.Dependent.Sum (DSum (..))
89import Data.Dependent.Sum (DSum (..))
90−import Data.GADT.Compare ((:~:) (..), GCompare (..), GEq (..), GOrdering (..))
90+import Data.GADT.Compare (GCompare (..), GEq (..), GOrdering (..))
91import Data.Map (Map)
91import Data.Map (Map)
92import Data.Maybe
92import Data.Maybe
93import Data.Monoid ((<>))
93import Data.Monoid ((<>))
94import Data.These
94import Data.These
95+import Data.Type.Equality ((:~:) (..))
95
96
96import Debug.Trace
97import Debug.Trace
97
98
src/Reflex/DynamicWriter/Class.hs−1
@@ -26,4 +26,3 @@ class (Monad m, Monoid w) => DynamicWriter t w m | m -> t w where
26
26
27instance DynamicWriter t w m => DynamicWriter t w (ReaderT r m) where
27instance DynamicWriter t w m => DynamicWriter t w (ReaderT r m) where
28 tellDyn = lift . tellDyn
28 tellDyn = lift . tellDyn
29−
src/Reflex/Network.hs+1−1
@@ -20,7 +20,7 @@ import Reflex.NotReady.Class
20import Reflex.PostBuild.Class
20import Reflex.PostBuild.Class
21
21
22-- | A 'Dynamic' "network": Takes a 'Dynamic' of network-creating actions and replaces the network whenever the 'Dynamic' updates.
22-- | A 'Dynamic' "network": Takes a 'Dynamic' of network-creating actions and replaces the network whenever the 'Dynamic' updates.
23−-- The returned Event of network results fires when the 'Dynamic' updates.
23+-- The returned Event of network results fires at post-build time and when the 'Dynamic' updates.
24-- Note: Often, the type 'a' is an Event, in which case the return value is an Event-of-Events, where the outer 'Event' fires
24-- Note: Often, the type 'a' is an Event, in which case the return value is an Event-of-Events, where the outer 'Event' fires
25-- when switching networks. Such an 'Event' would typically be flattened (via 'switchPromptly').
25-- when switching networks. Such an 'Event' would typically be flattened (via 'switchPromptly').
26networkView :: (NotReady t m, Adjustable t m, PostBuild t m) => Dynamic t (m a) -> m (Event t a)
26networkView :: (NotReady t m, Adjustable t m, PostBuild t m) => Dynamic t (m a) -> m (Event t a)
src/Reflex/Patch/MapWithMove.hs+1−1
@@ -155,7 +155,7 @@ patchThatSortsMapWith cmp m = PatchMapWithMove $ Map.fromList $ catMaybes $ zipW
155 Just (from, to)
155 Just (from, to)
156 reverseMapping = Map.fromList $ catMaybes $ zipWith f unsorted sorted
156 reverseMapping = Map.fromList $ catMaybes $ zipWith f unsorted sorted
157 g (to, _) (from, _) = if to == from then Nothing else
157 g (to, _) (from, _) = if to == from then Nothing else
158− let Just movingTo = Map.lookup from reverseMapping
158+ let Just movingTo = Map.lookup to reverseMapping
159 in Just (to, NodeInfo (From_Move from) $ Just movingTo)
159 in Just (to, NodeInfo (From_Move from) $ Just movingTo)
160
160
161-- | Create a 'PatchMapWithMove' that, if applied to the first 'Map' provided,
161-- | Create a 'PatchMapWithMove' that, if applied to the first 'Map' provided,
src/Reflex/PerformEvent/Base.hs+1−1
@@ -141,7 +141,7 @@ hostPerformEventT a = do
141 case mToPerform of
141 case mToPerform of
142 Nothing -> return [result']
142 Nothing -> return [result']
143 Just toPerform -> do
143 Just toPerform -> do
144− responses <- runHostFrame $ traverseRequesterData (Identity <$>) toPerform
144+ responses <- runHostFrame $ traverseRequesterData (fmap Identity) toPerform
145 mrt <- readRef responseTrigger
145 mrt <- readRef responseTrigger
146 let followupEventTriggers = case mrt of
146 let followupEventTriggers = case mrt of
147 Just rt -> [rt :=> Identity responses]
147 Just rt -> [rt :=> Identity responses]
src/Reflex/Query/Base.hs+5
@@ -16,6 +16,7 @@ module Reflex.Query.Base
16 , mapQueryResult
16 , mapQueryResult
17 , dynWithQueryT
17 , dynWithQueryT
18 , withQueryT
18 , withQueryT
19+ , mapQueryT
19 ) where
20 ) where
20
21
21import Control.Applicative (liftA2)
22import Control.Applicative (liftA2)
@@ -287,6 +288,10 @@ withQueryT f a = do
287 (fmapCheap (AdditivePatch . mapQuery f . unAdditivePatch) $ updatedIncremental q)
288 (fmapCheap (AdditivePatch . mapQuery f . unAdditivePatch) $ updatedIncremental q)
288 return result
289 return result
289
290
291+-- | Maps a function over a 'QueryT' that can change the underlying monad
292+mapQueryT :: (forall b. m b -> n b) -> QueryT t q m a -> QueryT t q n a
293+mapQueryT f (QueryT a) = QueryT $ mapStateT (mapEventWriterT (mapReaderT f)) a
294+
290-- | dynWithQueryT's (Dynamic t QueryMorphism) argument needs to be a group homomorphism at all times in order to behave correctly
295-- | dynWithQueryT's (Dynamic t QueryMorphism) argument needs to be a group homomorphism at all times in order to behave correctly
291dynWithQueryT :: (MonadFix m, PostBuild t m, Group q, Additive q, Group q', Additive q', Query q')
296dynWithQueryT :: (MonadFix m, PostBuild t m, Group q, Additive q, Group q', Additive q', Query q')
292 => Dynamic t (QueryMorphism q q')
297 => Dynamic t (QueryMorphism q q')
src/Reflex/Spider/Internal.hs+25−1
@@ -43,6 +43,8 @@ import Control.Monad.Reader.Class
43import Control.Monad.IO.Class
43import Control.Monad.IO.Class
44import Control.Monad.ReaderIO
44import Control.Monad.ReaderIO
45import Control.Monad.Ref
45import Control.Monad.Ref
46+import Control.Monad.Fail (MonadFail)
47+import qualified Control.Monad.Fail as MonadFail
46import Data.Align
48import Data.Align
47import Data.Coerce
49import Data.Coerce
48import Data.Dependent.Map (DMap, DSum (..))
50import Data.Dependent.Map (DMap, DSum (..))
@@ -63,6 +65,7 @@ import Data.Monoid ((<>))
63import Data.Proxy
65import Data.Proxy
64import Data.These
66import Data.These
65import Data.Traversable
67import Data.Traversable
68+import Data.Type.Equality ((:~:)(Refl))
66import Data.Witherable (Filterable, mapMaybe)
69import Data.Witherable (Filterable, mapMaybe)
67import GHC.Exts
70import GHC.Exts
68import GHC.IORef (IORef (..))
71import GHC.IORef (IORef (..))
@@ -103,6 +106,7 @@ import qualified Reflex.Host.Class
103import Reflex.NotReady.Class
106import Reflex.NotReady.Class
104import Reflex.Patch
107import Reflex.Patch
105import qualified Reflex.Patch.DMapWithMove as PatchDMapWithMove
108import qualified Reflex.Patch.DMapWithMove as PatchDMapWithMove
109+import Reflex.PerformEvent.Base (PerformEventT)
106
110
107#ifdef DEBUG_TRACE_EVENTS
111#ifdef DEBUG_TRACE_EVENTS
108import qualified Data.ByteString.Char8 as BS8
112import qualified Data.ByteString.Char8 as BS8
@@ -971,8 +975,10 @@ instance Monad (BehaviorM x) where
971 BehaviorM x >> BehaviorM y = BehaviorM $ x >> y
975 BehaviorM x >> BehaviorM y = BehaviorM $ x >> y
972 {-# INLINE return #-}
976 {-# INLINE return #-}
973 return x = BehaviorM $ return x
977 return x = BehaviorM $ return x
978+#if !MIN_VERSION_base(4,13,0)
974 {-# INLINE fail #-}
979 {-# INLINE fail #-}
975 fail s = BehaviorM $ fail s
980 fail s = BehaviorM $ fail s
981+#endif
976
982
977data BehaviorSubscribed x a
983data BehaviorSubscribed x a
978 = forall p. BehaviorSubscribedHold (Hold x p)
984 = forall p. BehaviorSubscribedHold (Hold x p)
@@ -2356,8 +2362,10 @@ instance HasSpiderTimeline x => Monad (Reflex.Class.Dynamic (SpiderTimeline x))
2356 x >>= f = SpiderDynamic $ dynamicDynIdentity $ newJoinDyn $ newMapDyn (unSpiderDynamic . f) $ unSpiderDynamic x
2362 x >>= f = SpiderDynamic $ dynamicDynIdentity $ newJoinDyn $ newMapDyn (unSpiderDynamic . f) $ unSpiderDynamic x
2357 {-# INLINE (>>) #-}
2363 {-# INLINE (>>) #-}
2358 (>>) = (*>)
2364 (>>) = (*>)
2365+#if !MIN_VERSION_base(4,13,0)
2359 {-# INLINE fail #-}
2366 {-# INLINE fail #-}
2360 fail _ = error "Dynamic does not support 'fail'"
2367 fail _ = error "Dynamic does not support 'fail'"
2368+#endif
2361
2369
2362{-# INLINABLE newJoinDyn #-}
2370{-# INLINABLE newJoinDyn #-}
2363newJoinDyn :: HasSpiderTimeline x => DynamicS x (Identity (DynamicS x (Identity a))) -> Reflex.Spider.Internal.Dyn x (Identity a)
2371newJoinDyn :: HasSpiderTimeline x => DynamicS x (Identity (DynamicS x (Identity a))) -> Reflex.Spider.Internal.Dyn x (Identity a)
@@ -2636,8 +2644,14 @@ instance Monad (SpiderHost x) where
2636 SpiderHost x >> SpiderHost y = SpiderHost $ x >> y
2644 SpiderHost x >> SpiderHost y = SpiderHost $ x >> y
2637 {-# INLINABLE return #-}
2645 {-# INLINABLE return #-}
2638 return x = SpiderHost $ return x
2646 return x = SpiderHost $ return x
2647+#if !MIN_VERSION_base(4,13,0)
2648+ {-# INLINABLE fail #-}
2649+ fail = MonadFail.fail
2650+#endif
2651+
2652+instance MonadFail (SpiderHost x) where
2639 {-# INLINABLE fail #-}
2653 {-# INLINABLE fail #-}
2640− fail s = SpiderHost $ fail s
2654+ fail s = SpiderHost $ MonadFail.fail s
2641
2655
2642-- | Run an action affecting the global Spider timeline; this will be guarded by
2656-- | Run an action affecting the global Spider timeline; this will be guarded by
2643-- a mutex for that timeline
2657-- a mutex for that timeline
@@ -2659,8 +2673,10 @@ instance Monad (SpiderHostFrame x) where
2659 SpiderHostFrame x >> SpiderHostFrame y = SpiderHostFrame $ x >> y
2673 SpiderHostFrame x >> SpiderHostFrame y = SpiderHostFrame $ x >> y
2660 {-# INLINABLE return #-}
2674 {-# INLINABLE return #-}
2661 return x = SpiderHostFrame $ return x
2675 return x = SpiderHostFrame $ return x
2676+#if !MIN_VERSION_base(4,13,0)
2662 {-# INLINABLE fail #-}
2677 {-# INLINABLE fail #-}
2663 fail s = SpiderHostFrame $ fail s
2678 fail s = SpiderHostFrame $ fail s
2679+#endif
2664
2680
2665instance NotReady (SpiderTimeline x) (SpiderHostFrame x) where
2681instance NotReady (SpiderTimeline x) (SpiderHostFrame x) where
2666 notReadyUntil _ = pure ()
2682 notReadyUntil _ = pure ()
@@ -2705,3 +2721,11 @@ instance MonadAtomicRef (SpiderHostFrame x) where
2705instance PrimMonad (SpiderHostFrame x) where
2721instance PrimMonad (SpiderHostFrame x) where
2706 type PrimState (SpiderHostFrame x) = PrimState IO
2722 type PrimState (SpiderHostFrame x) = PrimState IO
2707 primitive = SpiderHostFrame . EventM . primitive
2723 primitive = SpiderHostFrame . EventM . primitive
2724+
2725+instance NotReady (SpiderTimeline x) (SpiderHost x) where
2726+ notReadyUntil _ = return ()
2727+ notReady = return ()
2728+
2729+instance HasSpiderTimeline x => NotReady (SpiderTimeline x) (PerformEventT (SpiderTimeline x) (SpiderHost x)) where
2730+ notReadyUntil _ = return ()
2731+ notReady = return ()
src/Reflex/Workflow.hs+1−1
@@ -34,7 +34,7 @@ workflow w0 = do
34 rec eResult <- networkHold (unWorkflow w0) $ fmap unWorkflow $ switch $ snd <$> current eResult
34 rec eResult <- networkHold (unWorkflow w0) $ fmap unWorkflow $ switch $ snd <$> current eResult
35 return $ fmap fst eResult
35 return $ fmap fst eResult
36
36
37−-- | Similar to 'workflow', but outputs an 'Event' that fires whenever the current 'Workflow' is replaced by the next 'Workflow'.
37+-- | Similar to 'workflow', but outputs an 'Event' that fires at post-build time and whenever the current 'Workflow' is replaced by the next 'Workflow'.
38workflowView :: forall t m a. (Reflex t, NotReady t m, Adjustable t m, MonadFix m, MonadHold t m, PostBuild t m) => Workflow t m a -> m (Event t a)
38workflowView :: forall t m a. (Reflex t, NotReady t m, Adjustable t m, MonadFix m, MonadHold t m, PostBuild t m) => Workflow t m a -> m (Event t a)
39workflowView w0 = do
39workflowView w0 = do
40 rec eResult <- networkView . fmap unWorkflow =<< holdDyn w0 eReplace
40 rec eResult <- networkView . fmap unWorkflow =<< holdDyn w0 eReplace
test/Reflex/Bench/Focused.hs+1−1
@@ -134,7 +134,7 @@ holdDynChain :: (Reflex t, MonadHold t m) => Word -> Dynamic t Word -> m (Dynami
134holdDynChain = iterM (\d -> sample (current d) >>= flip holdDyn (updated d))
134holdDynChain = iterM (\d -> sample (current d) >>= flip holdDyn (updated d))
135
135
136buildDynChain :: (Reflex t, MonadHold t m) => Word -> Dynamic t Word -> m (Dynamic t Word)
136buildDynChain :: (Reflex t, MonadHold t m) => Word -> Dynamic t Word -> m (Dynamic t Word)
137−buildDynChain = iterM (\d -> do
137+buildDynChain = iterM (\d -> do
138 let b = fmap (+1) (current d)
138 let b = fmap (+1) (current d)
139 e = fmap (*2) (updated d)
139 e = fmap (*2) (updated d)
140 buildDynamic (sample b) e)
140 buildDynamic (sample b) e)
test/hlint.hs−7
@@ -30,16 +30,9 @@ main = do
30 ]
30 ]
31 matchFile = and <$> sequence
31 matchFile = and <$> sequence
32 [ extension ==? ".hs"
32 [ extension ==? ".hs"
33− , let notElem' = liftOp notElem
34− in filePath `notElem'` filePathExceptions pwd
35 ]
33 ]
36 files <- find recurseInto matchFile (pwd </> "src") --TODO: Someday fix all hints in tests, etc.
34 files <- find recurseInto matchFile (pwd </> "src") --TODO: Someday fix all hints in tests, etc.
37 ideas <- fmap concat $ forM files $ \f -> do
35 ideas <- fmap concat $ forM files $ \f -> do
38 putStr $ "linting file " ++ drop (length pwd + 1) f ++ "... "
36 putStr $ "linting file " ++ drop (length pwd + 1) f ++ "... "
39 runHlint f
37 runHlint f
40 if null ideas then exitSuccess else exitFailure
38 if null ideas then exitSuccess else exitFailure
41−
42−filePathExceptions :: FilePath -> [FilePath]
43−filePathExceptions pwd = map (pwd </>) $
44− [ "src/Data/AppendMap.hs" -- parse error when hlint runs
45− ]