on develop help sign in
Split out Base and Class for DynamicWriter/EventWriter
1895c99Elliot Cameron
reflex.cabal+4−2
@@ -87,10 +87,12 @@ library
87 Reflex,
87 Reflex,
88 Reflex.Class,
88 Reflex.Class,
89 Reflex.Collection,
89 Reflex.Collection,
90− Reflex.EventWriter,
90+ Reflex.EventWriter.Base,
91+ Reflex.EventWriter.Class,
91 Reflex.Dynamic,
92 Reflex.Dynamic,
92 Reflex.Dynamic.Uniq,
93 Reflex.Dynamic.Uniq,
93− Reflex.DynamicWriter,
94+ Reflex.DynamicWriter.Base,
95+ Reflex.DynamicWriter.Class,
94 Reflex.FastWeak,
96 Reflex.FastWeak,
95 Reflex.FunctorMaybe,
97 Reflex.FunctorMaybe,
96 Reflex.Host.Class,
98 Reflex.Host.Class,
src/Reflex.hs+4−2
@@ -7,13 +7,15 @@ module Reflex
7
7
8import Reflex.Class as X
8import Reflex.Class as X
9import Reflex.Collection as X
9import Reflex.Collection as X
10−import Reflex.EventWriter as X
10+import Reflex.EventWriter.Base as X
11+import Reflex.EventWriter.Class as X
11import Reflex.Dynamic as X
12import Reflex.Dynamic as X
12#ifdef USE_TEMPLATE_HASKELL
13#ifdef USE_TEMPLATE_HASKELL
13import Reflex.Dynamic.TH as X
14import Reflex.Dynamic.TH as X
14#endif
15#endif
15import Reflex.Dynamic.Uniq as X
16import Reflex.Dynamic.Uniq as X
16−import Reflex.DynamicWriter as X
17+import Reflex.DynamicWriter.Base as X
18+import Reflex.DynamicWriter.Class as X
17import Reflex.PerformEvent.Base as X
19import Reflex.PerformEvent.Base as X
18import Reflex.PerformEvent.Class as X
20import Reflex.PerformEvent.Class as X
19import Reflex.PostBuild.Base as X
21import Reflex.PostBuild.Base as X
src/Reflex/DynamicWriter.hs → src/Reflex/DynamicWriter/Base.hsrenamed+4−15
@@ -1,8 +1,5 @@
1−-- | This module defines 'MonadDynamicWriter' and 'DynamicWriterT', its standard
2−-- implementation.
3{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
4{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE FlexibleInstances #-}
5−{-# LANGUAGE FunctionalDependencies #-}
6{-# LANGUAGE GADTs #-}
3{-# LANGUAGE GADTs #-}
7{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
8{-# LANGUAGE LambdaCase #-}
5{-# LANGUAGE LambdaCase #-}
@@ -14,9 +11,8 @@
14#ifdef USE_REFLEX_OPTIMIZER
11#ifdef USE_REFLEX_OPTIMIZER
15{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
12{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
16#endif
13#endif
17−module Reflex.DynamicWriter
14+module Reflex.DynamicWriter.Base
18− ( MonadDynamicWriter (..)
19− , DynamicWriterT (..)
15+ ( DynamicWriterT (..)
20 , runDynamicWriterT
16 , runDynamicWriterT
21 , withDynamicWriterT
17 , withDynamicWriterT
22 ) where
18 ) where
@@ -40,6 +36,7 @@ import Data.Semigroup
40import Data.Some (Some)
36import Data.Some (Some)
41import Data.These
37import Data.These
42import Reflex.Class
38import Reflex.Class
39+import Reflex.DynamicWriter.Class
43import Reflex.Host.Class
40import Reflex.Host.Class
44import qualified Reflex.Patch.MapWithMove as MapWithMove
41import qualified Reflex.Patch.MapWithMove as MapWithMove
45import Reflex.PerformEvent.Class
42import Reflex.PerformEvent.Class
@@ -75,7 +72,7 @@ mergeDynIncrementalWithMove a = unsafeBuildIncremental (mapM (sample . current)
75 These p_ c -> (unPatchMapWithMove p_, c)
72 These p_ c -> (unPatchMapWithMove p_, c)
76 (pWithNewVals, noLongerMoved) = flip runState [] $ forM p $ MapWithMove.nodeInfoMapMFrom $ \case
73 (pWithNewVals, noLongerMoved) = flip runState [] $ forM p $ MapWithMove.nodeInfoMapMFrom $ \case
77 MapWithMove.From_Insert v -> return $ MapWithMove.From_Insert v
74 MapWithMove.From_Insert v -> return $ MapWithMove.From_Insert v
78− MapWithMove.From_Delete -> return $ MapWithMove.From_Delete
75+ MapWithMove.From_Delete -> return MapWithMove.From_Delete
79 MapWithMove.From_Move k -> case Map.lookup k changed of
76 MapWithMove.From_Move k -> case Map.lookup k changed of
80 Nothing -> return $ MapWithMove.From_Move k
77 Nothing -> return $ MapWithMove.From_Move k
81 Just v -> do
78 Just v -> do
@@ -107,11 +104,6 @@ runDynamicWriterT (DynamicWriterT a) = do
107 (result, ws) <- runStateT a []
104 (result, ws) <- runStateT a []
108 return (result, mconcat $ reverse ws)
105 return (result, mconcat $ reverse ws)
109
106
110−-- | 'MonadDynamicWriter' efficiently collects 'Dynamic' values using 'tellDyn'
111−-- and combines them monoidally to provide a 'Dynamic' result.
112−class (Monad m, Monoid w) => MonadDynamicWriter t w m | m -> t w where
113− tellDyn :: Dynamic t w -> m ()
114−
115instance (Monad m, Monoid w, Reflex t) => MonadDynamicWriter t w (DynamicWriterT t w m) where
107instance (Monad m, Monoid w, Reflex t) => MonadDynamicWriter t w (DynamicWriterT t w m) where
116 tellDyn w = DynamicWriterT $ modify (w :)
108 tellDyn w = DynamicWriterT $ modify (w :)
117
109
@@ -133,9 +125,6 @@ instance TriggerEvent t m => TriggerEvent t (DynamicWriterT t w m) where
133instance PostBuild t m => PostBuild t (DynamicWriterT t w m) where
125instance PostBuild t m => PostBuild t (DynamicWriterT t w m) where
134 getPostBuild = lift getPostBuild
126 getPostBuild = lift getPostBuild
135
127
136−instance MonadDynamicWriter t w m => MonadDynamicWriter t w (ReaderT r m) where
137− tellDyn = lift . tellDyn
138−
139instance MonadState s m => MonadState s (DynamicWriterT t w m) where
128instance MonadState s m => MonadState s (DynamicWriterT t w m) where
140 get = lift get
129 get = lift get
141 put = lift . put
130 put = lift . put
src/Reflex/DynamicWriter/Class.hsnew file+24
@@ -0,0 +1,24 @@
1+-- | This module defines the 'MonadDynamicWriter' class.
2+{-# LANGUAGE CPP #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FunctionalDependencies #-}
5+{-# LANGUAGE MultiParamTypeClasses #-}
6+{-# LANGUAGE UndecidableInstances #-}
7+#ifdef USE_REFLEX_OPTIMIZER
8+{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
9+#endif
10+module Reflex.DynamicWriter.Class
11+ ( MonadDynamicWriter (..)
12+ ) where
13+
14+import Control.Monad.Reader (ReaderT, lift)
15+import Reflex.Class (Dynamic)
16+
17+-- | 'MonadDynamicWriter' efficiently collects 'Dynamic' values using 'tellDyn'
18+-- and combines them monoidally to provide a 'Dynamic' result.
19+class (Monad m, Monoid w) => MonadDynamicWriter t w m | m -> t w where
20+ tellDyn :: Dynamic t w -> m ()
21+
22+instance MonadDynamicWriter t w m => MonadDynamicWriter t w (ReaderT r m) where
23+ tellDyn = lift . tellDyn
24+
src/Reflex/EventWriter.hs → src/Reflex/EventWriter/Base.hsrenamed+3−12
@@ -3,7 +3,6 @@
3{-# LANGUAGE CPP #-}
3{-# LANGUAGE CPP #-}
4{-# LANGUAGE ExistentialQuantification #-}
4{-# LANGUAGE ExistentialQuantification #-}
5{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE FlexibleInstances #-}
6−{-# LANGUAGE FunctionalDependencies #-}
7{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE GeneralizedNewtypeDeriving #-}
8{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
9{-# LANGUAGE Rank2Types #-}
8{-# LANGUAGE Rank2Types #-}
@@ -14,16 +13,16 @@
14#ifdef USE_REFLEX_OPTIMIZER
13#ifdef USE_REFLEX_OPTIMIZER
15{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
14{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
16#endif
15#endif
17−module Reflex.EventWriter
16+module Reflex.EventWriter.Base
18 ( EventWriterT (..)
17 ( EventWriterT (..)
19 , runEventWriterT
18 , runEventWriterT
20− , EventWriter (..)
21 , runWithReplaceEventWriterTWith
19 , runWithReplaceEventWriterTWith
22 , sequenceDMapWithAdjustEventWriterTWith
20 , sequenceDMapWithAdjustEventWriterTWith
23 , withEventWriterT
21 , withEventWriterT
24 ) where
22 ) where
25
23
26import Reflex.Class
24import Reflex.Class
25+import Reflex.EventWriter.Class (EventWriter, tellEvent)
27import Reflex.Host.Class
26import Reflex.Host.Class
28import Reflex.PerformEvent.Class
27import Reflex.PerformEvent.Class
29import Reflex.PostBuild.Class
28import Reflex.PostBuild.Class
@@ -41,7 +40,7 @@ import qualified Data.Dependent.Map as DMap
41import Data.Foldable
40import Data.Foldable
42import Data.Functor.Compose
41import Data.Functor.Compose
43import Data.Functor.Misc
42import Data.Functor.Misc
44−import Data.GADT.Compare (GEq (..), GCompare (..), GOrdering (..))
43+import Data.GADT.Compare (GCompare (..), GEq (..), GOrdering (..))
45import Data.IntMap.Strict (IntMap)
44import Data.IntMap.Strict (IntMap)
46import qualified Data.IntMap.Strict as IntMap
45import qualified Data.IntMap.Strict as IntMap
47import Data.List.NonEmpty (NonEmpty (..))
46import Data.List.NonEmpty (NonEmpty (..))
@@ -53,11 +52,6 @@ import Data.Type.Equality
53
52
54import Unsafe.Coerce
53import Unsafe.Coerce
55
54
56−-- | 'EventWriter' efficiently collects 'Event' values using 'tellEvent'
57−-- and combines them monoidally to provide an 'Event' result.
58−class (Monad m, Semigroup w) => EventWriter t w m | m -> t w where
59− tellEvent :: Event t w -> m ()
60−
61{-# DEPRECATED TellId "Do not construct this directly; use tellId instead" #-}
55{-# DEPRECATED TellId "Do not construct this directly; use tellId instead" #-}
62newtype TellId w x
56newtype TellId w x
63 = TellId Int -- ^ WARNING: Do not construct this directly; use 'TellId' instead
57 = TellId Int -- ^ WARNING: Do not construct this directly; use 'TellId' instead
@@ -118,9 +112,6 @@ instance (Reflex t, Monad m, Semigroup w) => EventWriter t w (EventWriterT t w m
118 , _eventWriterState_told = (tellId myId :=> w) : _eventWriterState_told old
112 , _eventWriterState_told = (tellId myId :=> w) : _eventWriterState_told old
119 }
113 }
120
114
121−instance EventWriter t w m => EventWriter t w (ReaderT r m) where
122− tellEvent = lift . tellEvent
123−
124instance MonadTrans (EventWriterT t w) where
115instance MonadTrans (EventWriterT t w) where
125 lift = EventWriterT . lift
116 lift = EventWriterT . lift
126
117
src/Reflex/EventWriter/Class.hsnew file+26
@@ -0,0 +1,26 @@
1+-- | This module defines the 'EventWriter' class.
2+{-# LANGUAGE CPP #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FunctionalDependencies #-}
5+{-# LANGUAGE UndecidableInstances #-}
6+#ifdef USE_REFLEX_OPTIMIZER
7+{-# OPTIONS_GHC -fplugin=Reflex.Optimizer #-}
8+#endif
9+module Reflex.EventWriter.Class
10+ ( EventWriter (..)
11+ ) where
12+
13+import Control.Monad.Reader (ReaderT, lift)
14+import Data.Semigroup (Semigroup)
15+
16+import Reflex.Class (Event)
17+
18+
19+-- | 'EventWriter' efficiently collects 'Event' values using 'tellEvent'
20+-- and combines them via 'Semigroup' to provide an 'Event' result.
21+class (Monad m, Semigroup w) => EventWriter t w m | m -> t w where
22+ tellEvent :: Event t w -> m ()
23+
24+
25+instance EventWriter t w m => EventWriter t w (ReaderT r m) where
26+ tellEvent = lift . tellEvent
src/Reflex/NotReady/Class.hs+2−2
@@ -18,8 +18,8 @@ import Control.Monad.Reader (ReaderT)
18import Reflex.Class
18import Reflex.Class
19import Reflex.Host.Class
19import Reflex.Host.Class
20import Reflex.PostBuild.Base (PostBuildT)
20import Reflex.PostBuild.Base (PostBuildT)
21−import Reflex.EventWriter (EventWriterT)
21+import Reflex.EventWriter.Base (EventWriterT)
22−import Reflex.DynamicWriter (DynamicWriterT)
22+import Reflex.DynamicWriter.Base (DynamicWriterT)
23import Reflex.Query.Base (QueryT)
23import Reflex.Query.Base (QueryT)
24import Reflex.Requester.Base (RequesterT)
24import Reflex.Requester.Base (RequesterT)
25import Reflex.PerformEvent.Base (PerformEventT(..))
25import Reflex.PerformEvent.Base (PerformEventT(..))
src/Reflex/Query/Base.hs+2−1
@@ -37,7 +37,8 @@ import qualified Data.Some as Some
37import Data.These
37import Data.These
38
38
39import Reflex.Class
39import Reflex.Class
40−import Reflex.EventWriter
40+import Reflex.EventWriter.Class
41+import Reflex.EventWriter.Base
41import Reflex.Host.Class
42import Reflex.Host.Class
42import Reflex.PerformEvent.Class
43import Reflex.PerformEvent.Class
43import Reflex.PostBuild.Class
44import Reflex.PostBuild.Class
test/EventWriterT.hs+1−1
@@ -6,7 +6,7 @@ import Control.Monad
6import Data.These
6import Data.These
7
7
8import Reflex
8import Reflex
9−import Reflex.EventWriter
9+import Reflex.EventWriter.Base
10import Test.Run
10import Test.Run
11
11
12main :: IO ()
12main :: IO ()