on develop help sign in
Merge pull request #60 from HectorAE/develop

Add Either and These event-splitting functions.

commit49a5160aab417f24bb2b36e8006b9847bde7d4c5 authorRyan Trinkle <ryan.trinkle@gmail.com> dateWed 10 Aug 2016, 14:50 (10 years ago) parentd24121cc0f6067
1 file changed+15
src/Reflex/Class.hs+15
src/Reflex/Class.hs+15
@@ -36,6 +36,8 @@ module Reflex.Class
3636 , mergeWith
3737 -- ** Breaking up 'Event's
3838 , splitE
39+ , fanEither
40+ , fanThese
3941 , fanMap
4042 , dmapToThese
4143 , EitherTag (..)
@@ -95,6 +97,7 @@ import Data.Bifunctor
9597import Data.Dependent.Map (DMap, DSum (..), GCompare (..), GOrdering (..))
9698import qualified Data.Dependent.Map as DMap
9799import Data.Dependent.Sum (ShowTag (..))
100+import Data.Either
98101import Data.Foldable
99102import Data.Functor.Bind hiding (join)
100103import qualified Data.Functor.Bind as Bind
@@ -600,6 +603,18 @@ mergeList es = mergeWith (<>) $ map (fmap (:|[])) es
600603mergeMap :: (Reflex t, Ord k) => Map k (Event t a) -> Event t (Map k a)
601604mergeMap = fmap dmapToMap . merge . mapWithFunctorToDMap
602605
606+-- | Split the event into separate events for 'Left' and 'Right' values.
607+fanEither :: Reflex t => Event t (Either a b) -> (Event t a, Event t b)
608+fanEither e = let justLeft = either Just (const Nothing)
609+ justRight = either (const Nothing) Just
610+ in
611+ (fmapMaybe justLeft e, fmapMaybe justRight e)
612+
613+-- | Split the event into separate events for 'This' and 'That' values,
614+-- allowing them to fire simultaneously when the input value is 'These'.
615+fanThese :: Reflex t => Event t (These a b) -> (Event t a, Event t b)
616+fanThese e = (fmapMaybe justThis e, fmapMaybe justThat e)
617+
603618-- | Split the event into an 'EventSelector' that allows efficient selection of
604619-- the individual 'Event's.
605620fanMap :: (Reflex t, Ord k) => Event t (Map k a) -> EventSelector t (Const2 k a)