on develop help sign in
Merge pull request #211 from reflex-frp/dedup-adjustable
84a2044Ryan Trinkle
reflex.cabal+1
@@ -72,6 +72,7 @@ library
72 Data.WeakBag,
72 Data.WeakBag,
73 Reflex,
73 Reflex,
74 Reflex.Class,
74 Reflex.Class,
75+ Reflex.Adjustable.Class,
75 Reflex.Collection,
76 Reflex.Collection,
76 Reflex.Dynamic,
77 Reflex.Dynamic,
77 Reflex.Dynamic.Uniq,
78 Reflex.Dynamic.Uniq,
src/Reflex.hs+1
@@ -6,6 +6,7 @@ module Reflex
6 ) where
6 ) where
7
7
8import Reflex.Class as X
8import Reflex.Class as X
9+import Reflex.Adjustable.Class as X
9import Reflex.Collection as X
10import Reflex.Collection as X
10import Reflex.Dynamic as X
11import Reflex.Dynamic as X
11import Reflex.EventWriter.Base as X
12import Reflex.EventWriter.Base as X
src/Reflex/Adjustable/Class.hs+12−6
@@ -1,4 +1,5 @@
1{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
2+{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FunctionalDependencies #-}
4{-# LANGUAGE FunctionalDependencies #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
@@ -16,22 +17,20 @@ module Reflex.Adjustable.Class
16 , sequenceDMapWithAdjust
17 , sequenceDMapWithAdjust
17 , sequenceDMapWithAdjustWithMove
18 , sequenceDMapWithAdjustWithMove
18 , mapMapWithAdjustWithMove
19 , mapMapWithAdjustWithMove
20+ -- * Deprecated aliases
21+ , MonadAdjust
19 ) where
22 ) where
20
23
21import Control.Monad.Identity
24import Control.Monad.Identity
22import Control.Monad.Reader
25import Control.Monad.Reader
23−import Data.Align
24import Data.Dependent.Map (DMap, GCompare (..))
26import Data.Dependent.Map (DMap, GCompare (..))
25import Data.Functor.Constant
27import Data.Functor.Constant
26import Data.Functor.Misc
28import Data.Functor.Misc
29+import Data.IntMap.Strict (IntMap)
30+import qualified Data.IntMap.Strict as IntMap
27import Data.Map (Map)
31import Data.Map (Map)
28−import qualified Data.Map as Map
29−import Data.Map.Misc
30−import Data.These
31
32
32import Reflex.Class
33import Reflex.Class
33−import Reflex.Dynamic
34−import Reflex.PostBuild.Class
35
34
36-- | A 'Monad' that supports adjustment over time. After an action has been
35-- | A 'Monad' that supports adjustment over time. After an action has been
37-- run, if the given events fire, it will adjust itself so that its net effect
36-- run, if the given events fire, it will adjust itself so that its net effect
@@ -69,3 +68,10 @@ mapMapWithAdjustWithMove :: forall t m k v v'. (Adjustable t m, Ord k) => (k ->
69mapMapWithAdjustWithMove f m0 m' = do
68mapMapWithAdjustWithMove f m0 m' = do
70 (out0 :: DMap (Const2 k v) (Constant v'), out') <- traverseDMapWithKeyWithAdjustWithMove (\(Const2 k) (Identity v) -> Constant <$> f k v) (mapToDMap m0) (const2PatchDMapWithMoveWith Identity <$> m')
69 (out0 :: DMap (Const2 k v) (Constant v'), out') <- traverseDMapWithKeyWithAdjustWithMove (\(Const2 k) (Identity v) -> Constant <$> f k v) (mapToDMap m0) (const2PatchDMapWithMoveWith Identity <$> m')
71 return (dmapToMapWith (\(Constant v') -> v') out0, patchDMapWithMoveToPatchMapWithMoveWith (\(Constant v') -> v') <$> out')
70 return (dmapToMapWith (\(Constant v') -> v') out0, patchDMapWithMoveToPatchMapWithMoveWith (\(Constant v') -> v') <$> out')
71+
72+--------------------------------------------------------------------------------
73+-- Deprecated functions
74+--------------------------------------------------------------------------------
75+
76+{-# DEPRECATED MonadAdjust "Use Adjustable instead" #-}
77+type MonadAdjust = Adjustable
src/Reflex/Class.hs−51
@@ -120,15 +120,9 @@ module Reflex.Class
120 , ffilter
120 , ffilter
121 , filterLeft
121 , filterLeft
122 , filterRight
122 , filterRight
123− -- * 'Adjustable'
124− , Adjustable(..)
125− , sequenceDMapWithAdjust
126− , sequenceDMapWithAdjustWithMove
127− , mapMapWithAdjustWithMove
128 -- * Miscellaneous convenience functions
123 -- * Miscellaneous convenience functions
129 , ffor
124 , ffor
130 -- * Deprecated functions
125 -- * Deprecated functions
131− , MonadAdjust
132 , appendEvents
126 , appendEvents
133 , onceE
127 , onceE
134 , sequenceThese
128 , sequenceThese
@@ -163,7 +157,6 @@ import qualified Data.Dependent.Map as DMap
163import Data.FastMutableIntMap (PatchIntMap)
157import Data.FastMutableIntMap (PatchIntMap)
164import Data.Foldable
158import Data.Foldable
165import Data.Functor.Bind
159import Data.Functor.Bind
166−import Data.Functor.Constant
167import Data.Functor.Misc
160import Data.Functor.Misc
168import Data.Functor.Plus
161import Data.Functor.Plus
169import Data.IntMap.Strict (IntMap)
162import Data.IntMap.Strict (IntMap)
@@ -1062,47 +1055,6 @@ infixl 4 <@>
1062(<@) = tag
1055(<@) = tag
1063infixl 4 <@
1056infixl 4 <@
1064
1057
1065−------------------
1066−-- Adjustable
1067−------------------
1068−
1069−-- | A 'Monad' that supports adjustment over time. After an action has been
1070−-- run, if the given events fire, it will adjust itself so that its net effect
1071−-- is as though it had originally been run with the new value. Note that there
1072−-- is some issue here with persistent side-effects: obviously, IO (and some
1073−-- other side-effects) cannot be undone, so it is up to the instance implementer
1074−-- to determine what the best meaning for this class is in such cases.
1075−class (Reflex t, Monad m) => Adjustable t m | m -> t where
1076− runWithReplace :: m a -> Event t (m b) -> m (a, Event t b)
1077− traverseIntMapWithKeyWithAdjust :: (IntMap.Key -> v -> m v') -> IntMap v -> Event t (PatchIntMap v) -> m (IntMap v', Event t (PatchIntMap v'))
1078− traverseDMapWithKeyWithAdjust :: GCompare k => (forall a. k a -> v a -> m (v' a)) -> DMap k v -> Event t (PatchDMap k v) -> m (DMap k v', Event t (PatchDMap k v'))
1079− traverseDMapWithKeyWithAdjustWithMove :: GCompare k => (forall a. k a -> v a -> m (v' a)) -> DMap k v -> Event t (PatchDMapWithMove k v) -> m (DMap k v', Event t (PatchDMapWithMove k v'))
1080−
1081−instance Adjustable t m => Adjustable t (ReaderT r m) where
1082− runWithReplace a0 a' = do
1083− r <- ask
1084− lift $ runWithReplace (runReaderT a0 r) $ fmap (`runReaderT` r) a'
1085− traverseIntMapWithKeyWithAdjust f dm0 dm' = do
1086− r <- ask
1087− lift $ traverseIntMapWithKeyWithAdjust (\k v -> runReaderT (f k v) r) dm0 dm'
1088− traverseDMapWithKeyWithAdjust f dm0 dm' = do
1089− r <- ask
1090− lift $ traverseDMapWithKeyWithAdjust (\k v -> runReaderT (f k v) r) dm0 dm'
1091− traverseDMapWithKeyWithAdjustWithMove f dm0 dm' = do
1092− r <- ask
1093− lift $ traverseDMapWithKeyWithAdjustWithMove (\k v -> runReaderT (f k v) r) dm0 dm'
1094−
1095−sequenceDMapWithAdjust :: (GCompare k, Adjustable t m) => DMap k m -> Event t (PatchDMap k m) -> m (DMap k Identity, Event t (PatchDMap k Identity))
1096−sequenceDMapWithAdjust = traverseDMapWithKeyWithAdjust $ \_ -> fmap Identity
1097−
1098−sequenceDMapWithAdjustWithMove :: (GCompare k, Adjustable t m) => DMap k m -> Event t (PatchDMapWithMove k m) -> m (DMap k Identity, Event t (PatchDMapWithMove k Identity))
1099−sequenceDMapWithAdjustWithMove = traverseDMapWithKeyWithAdjustWithMove $ \_ -> fmap Identity
1100−
1101−mapMapWithAdjustWithMove :: forall t m k v v'. (Adjustable t m, Ord k) => (k -> v -> m v') -> Map k v -> Event t (PatchMapWithMove k v) -> m (Map k v', Event t (PatchMapWithMove k v'))
1102−mapMapWithAdjustWithMove f m0 m' = do
1103− (out0 :: DMap (Const2 k v) (Constant v'), out') <- traverseDMapWithKeyWithAdjustWithMove (\(Const2 k) (Identity v) -> Constant <$> f k v) (mapToDMap m0) (const2PatchDMapWithMoveWith Identity <$> m')
1104− return (dmapToMapWith (\(Constant v') -> v') out0, patchDMapWithMoveToPatchMapWithMoveWith (\(Constant v') -> v') <$> out')
1105−
1106------------------
1058------------------
1107-- Cheap Functions
1059-- Cheap Functions
1108------------------
1060------------------
@@ -1151,9 +1103,6 @@ mergeWithFoldCheap' f es =
1151-- Deprecated functions
1103-- Deprecated functions
1152--------------------------------------------------------------------------------
1104--------------------------------------------------------------------------------
1153
1105
1154−{-# DEPRECATED MonadAdjust "Use Adjustable instead" #-}
1155−type MonadAdjust = Adjustable
1156−
1157-- | Create a new 'Event' that occurs if at least one of the supplied 'Event's
1106-- | Create a new 'Event' that occurs if at least one of the supplied 'Event's
1158-- occurs. If both occur at the same time they are combined using 'mappend'.
1107-- occurs. If both occur at the same time they are combined using 'mappend'.
1159{-# DEPRECATED appendEvents "If a 'Semigroup a' instance is available, use 'mappend'; otherwise, use 'alignWith (mergeThese mappend)' instead" #-}
1108{-# DEPRECATED appendEvents "If a 'Semigroup a' instance is available, use 'mappend'; otherwise, use 'alignWith (mergeThese mappend)' instead" #-}
src/Reflex/Collection.hs+1
@@ -34,6 +34,7 @@ import Data.Map.Misc
34import Data.These
34import Data.These
35
35
36import Reflex.Class
36import Reflex.Class
37+import Reflex.Adjustable.Class
37import Reflex.Dynamic
38import Reflex.Dynamic
38import Reflex.PostBuild.Class
39import Reflex.PostBuild.Class
39
40
src/Reflex/DynamicWriter/Base.hs+2
@@ -36,7 +36,9 @@ import qualified Data.Map as Map
36import Data.Semigroup
36import Data.Semigroup
37import Data.Some (Some)
37import Data.Some (Some)
38import Data.These
38import Data.These
39+
39import Reflex.Class
40import Reflex.Class
41+import Reflex.Adjustable.Class
40import Reflex.DynamicWriter.Class
42import Reflex.DynamicWriter.Class
41import Reflex.Host.Class
43import Reflex.Host.Class
42import qualified Reflex.Patch.MapWithMove as MapWithMove
44import qualified Reflex.Patch.MapWithMove as MapWithMove
src/Reflex/EventWriter/Base.hs+1
@@ -23,6 +23,7 @@ module Reflex.EventWriter.Base
23 ) where
23 ) where
24
24
25import Reflex.Class
25import Reflex.Class
26+import Reflex.Adjustable.Class
26import Reflex.EventWriter.Class (EventWriter, tellEvent)
27import Reflex.EventWriter.Class (EventWriter, tellEvent)
27import Reflex.Host.Class
28import Reflex.Host.Class
28import Reflex.PerformEvent.Class
29import Reflex.PerformEvent.Class
src/Reflex/Network.hs+1
@@ -10,6 +10,7 @@ module Reflex.Network
10 ) where
10 ) where
11
11
12import Reflex.Class
12import Reflex.Class
13+import Reflex.Adjustable.Class
13import Reflex.NotReady.Class
14import Reflex.NotReady.Class
14import Reflex.PostBuild.Class
15import Reflex.PostBuild.Class
15
16
src/Reflex/PerformEvent/Base.hs+1
@@ -25,6 +25,7 @@ module Reflex.PerformEvent.Base
25 ) where
25 ) where
26
26
27import Reflex.Class
27import Reflex.Class
28+import Reflex.Adjustable.Class
28import Reflex.Host.Class
29import Reflex.Host.Class
29import Reflex.PerformEvent.Class
30import Reflex.PerformEvent.Class
30import Reflex.Requester.Base
31import Reflex.Requester.Base
src/Reflex/PostBuild/Base.hs+1
@@ -23,6 +23,7 @@ module Reflex.PostBuild.Base
23 ) where
23 ) where
24
24
25import Reflex.Class
25import Reflex.Class
26+import Reflex.Adjustable.Class
26import Reflex.Host.Class
27import Reflex.Host.Class
27import Reflex.PerformEvent.Class
28import Reflex.PerformEvent.Class
28import Reflex.PostBuild.Class
29import Reflex.PostBuild.Class
src/Reflex/Query/Base.hs+1
@@ -38,6 +38,7 @@ import qualified Data.Some as Some
38import Data.These
38import Data.These
39
39
40import Reflex.Class
40import Reflex.Class
41+import Reflex.Adjustable.Class
41import Reflex.EventWriter.Base
42import Reflex.EventWriter.Base
42import Reflex.EventWriter.Class
43import Reflex.EventWriter.Class
43import Reflex.Host.Class
44import Reflex.Host.Class
src/Reflex/Requester/Base.hs+1
@@ -32,6 +32,7 @@ module Reflex.Requester.Base
32 ) where
32 ) where
33
33
34import Reflex.Class
34import Reflex.Class
35+import Reflex.Adjustable.Class
35import Reflex.Dynamic
36import Reflex.Dynamic
36import Reflex.Host.Class
37import Reflex.Host.Class
37import Reflex.PerformEvent.Class
38import Reflex.PerformEvent.Class
src/Reflex/TriggerEvent/Base.hs+1
@@ -25,6 +25,7 @@ import Data.IORef
25import Data.Monoid ((<>))
25import Data.Monoid ((<>))
26import qualified Data.Semigroup as S
26import qualified Data.Semigroup as S
27import Reflex.Class
27import Reflex.Class
28+import Reflex.Adjustable.Class
28import Reflex.Host.Class
29import Reflex.Host.Class
29import Reflex.PerformEvent.Class
30import Reflex.PerformEvent.Class
30import Reflex.PostBuild.Class
31import Reflex.PostBuild.Class
src/Reflex/Widget/Basic.hs+2
@@ -10,7 +10,9 @@ module Reflex.Widget.Basic where
10
10
11import Control.Monad.Fix (MonadFix)
11import Control.Monad.Fix (MonadFix)
12import Data.Map (Map)
12import Data.Map (Map)
13+
13import Reflex.Class
14import Reflex.Class
15+import Reflex.Adjustable.Class
14import Reflex.Patch.MapWithMove
16import Reflex.Patch.MapWithMove
15
17
16
18
src/Reflex/Workflow.hs+1
@@ -13,6 +13,7 @@ import Control.Arrow ((***))
13import Control.Monad.Fix (MonadFix)
13import Control.Monad.Fix (MonadFix)
14
14
15import Reflex.Class
15import Reflex.Class
16+import Reflex.Adjustable.Class
16import Reflex.Network
17import Reflex.Network
17import Reflex.NotReady.Class
18import Reflex.NotReady.Class
18import Reflex.PostBuild.Class
19import Reflex.PostBuild.Class