on develop help sign in
Add 'mergeMap' and 'fanMap'
78e0a4fRyan Trinkle
src/Data/Functor/Misc.hs+11
@@ -2,6 +2,8 @@
2module Data.Functor.Misc where
2module Data.Functor.Misc where
3
3
4import Data.GADT.Compare
4import Data.GADT.Compare
5+import Data.Map (Map)
6+import qualified Data.Map as Map
5import Data.Dependent.Map (DMap, DSum (..))
7import Data.Dependent.Map (DMap, DSum (..))
6import qualified Data.Dependent.Map as DMap
8import qualified Data.Dependent.Map as DMap
7import Data.Typeable hiding (Refl)
9import Data.Typeable hiding (Refl)
@@ -58,3 +60,12 @@ rewrapDMap f = DMap.fromDistinctAscList . map (\(WrapArg k :=> v) -> WrapArg k :
58
60
59unwrapDMap :: (forall a. f a -> a) -> DMap (WrapArg f k) -> DMap k
61unwrapDMap :: (forall a. f a -> a) -> DMap (WrapArg f k) -> DMap k
60unwrapDMap f = DMap.fromDistinctAscList . map (\(WrapArg k :=> v) -> k :=> f v) . DMap.toAscList
62unwrapDMap 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
13import Data.GADT.Compare (GEq (..), (:~:) (..))
13import Data.GADT.Compare (GEq (..), (:~:) (..))
14import Data.GADT.Show (GShow (..))
14import Data.GADT.Show (GShow (..))
15import Data.Dependent.Sum (ShowTag (..))
15import Data.Dependent.Sum (ShowTag (..))
16+import Data.Map (Map)
17+import qualified Data.Map as Map
16import Data.Dependent.Map (DMap, DSum (..), GCompare (..), GOrdering (..))
18import Data.Dependent.Map (DMap, DSum (..), GCompare (..), GOrdering (..))
17import qualified Data.Dependent.Map as DMap
19import qualified Data.Dependent.Map as DMap
18import Data.Functor.Misc
20import Data.Functor.Misc
@@ -216,6 +218,12 @@ mergeList :: Reflex t => [Event t a] -> Event t (NonEmpty a)
216mergeList [] = never
218mergeList [] = never
217mergeList es = mergeWith (<>) $ map (fmap (:|[])) es
219mergeList es = mergeWith (<>) $ map (fmap (:|[])) es
218
220
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+
219-- | Switches to the new event whenever it receives one; the new event is used immediately, on the same frame that it is switched to
227-- | Switches to the new event whenever it receives one; the new event is used immediately, on the same frame that it is switched to
220switchPromptly :: forall t m a. (Reflex t, MonadHold t m) => Event t a -> Event t (Event t a) -> m (Event t a)
228switchPromptly :: forall t m a. (Reflex t, MonadHold t m) => Event t a -> Event t (Event t a) -> m (Event t a)
221switchPromptly ea0 eea = do
229switchPromptly ea0 eea = do