on develop help sign in
Add 'mergeMap' and 'fanMap'
commit78e0a4f8120efc110ca9dd946c9064e25b7ddf5b authorRyan Trinkle <ryan.trinkle@gmail.com> dateSat 28 Feb 2015, 19:46 (12 years ago) parente232f1c
2 files changed+19
src/Data/Functor/Misc.hs+11 src/Reflex/Class.hs+8
src/Data/Functor/Misc.hs+11
@@ -2,6 +2,8 @@
22module Data.Functor.Misc where
33
44import Data.GADT.Compare
5+import Data.Map (Map)
6+import qualified Data.Map as Map
57import Data.Dependent.Map (DMap, DSum (..))
68import qualified Data.Dependent.Map as DMap
79import Data.Typeable hiding (Refl)
@@ -58,3 +60,12 @@ rewrapDMap f = DMap.fromDistinctAscList . map (\(WrapArg k :=> v) -> WrapArg k :
5860
5961unwrapDMap :: (forall a. f a -> a) -> DMap (WrapArg f k) -> DMap k
6062unwrapDMap f = DMap.fromDistinctAscList . map (\(WrapArg k :=> v) -> k :=> f v) . DMap.toAscList
63+
64+mapToDMap :: Map k v -> DMap (Const2 k v)
65+mapToDMap = DMap.fromDistinctAscList . map (\(k, v) -> Const2 k :=> v) . Map.toAscList
66+
67+mapWithFunctorToDMap :: Map k (f v) -> DMap (WrapArg f (Const2 k v))
68+mapWithFunctorToDMap = DMap.fromDistinctAscList . map (\(k, v) -> WrapArg (Const2 k) :=> v) . Map.toAscList
69+
70+dmapToMap :: DMap (Const2 k v) -> Map k v
71+dmapToMap = Map.fromDistinctAscList . map (\(Const2 k :=> v) -> (k, v)) . DMap.toAscList
src/Reflex/Class.hs+8
@@ -13,6 +13,8 @@ import Data.Align
1313import Data.GADT.Compare (GEq (..), (:~:) (..))
1414import Data.GADT.Show (GShow (..))
1515import Data.Dependent.Sum (ShowTag (..))
16+import Data.Map (Map)
17+import qualified Data.Map as Map
1618import Data.Dependent.Map (DMap, DSum (..), GCompare (..), GOrdering (..))
1719import qualified Data.Dependent.Map as DMap
1820import Data.Functor.Misc
@@ -216,6 +218,12 @@ mergeList :: Reflex t => [Event t a] -> Event t (NonEmpty a)
216218mergeList [] = never
217219mergeList es = mergeWith (<>) $ map (fmap (:|[])) es
218220
221+mergeMap :: (Reflex t, Ord k) => Map k (Event t a) -> Event t (Map k a)
222+mergeMap = fmap dmapToMap . merge . mapWithFunctorToDMap
223+
224+fanMap :: (Reflex t, Ord k) => Event t (Map k a) -> EventSelector t (Const2 k a)
225+fanMap = fan . fmap mapToDMap
226+
219227-- | Switches to the new event whenever it receives one; the new event is used immediately, on the same frame that it is switched to
220228switchPromptly :: forall t m a. (Reflex t, MonadHold t m) => Event t a -> Event t (Event t a) -> m (Event t a)
221229switchPromptly ea0 eea = do