@@ -169,6 +169,7 @@ module Reflex.Class
169 , tagCheap
169 , tagCheap
170 , mergeWithCheap
170 , mergeWithCheap
171 , mergeWithCheap'
171 , mergeWithCheap'
172 -- * Slow, but general, implementations
173 -- * Slow, but general, implementations
173 , slowHeadE
174 , slowHeadE
@@ -890,6 +891,9 @@ instance (Semigroup a, Reflex t) => Semigroup (Event t a) where
890 sconcat = fmap sconcat . mergeList . toList
891 sconcat = fmap sconcat . mergeList . toList
891 stimes n = fmap $ stimes n
892 stimes n = fmap $ stimes n
894+sconcatCheap :: (Semigroup a, Reflex t) => NonEmpty (Event t a) -> Event t a
895+sconcatCheap = fmapCheap sconcat . mergeList . toList
893instance (Semigroup a, Reflex t) => Monoid (Event t a) where
897instance (Semigroup a, Reflex t) => Monoid (Event t a) where
894 mempty = never
898 mempty = never
895 mappend = (<>)
899 mappend = (<>)
@@ -904,6 +908,8 @@ mergeWith = mergeWith' id
905{-# INLINE mergeWith' #-}
909{-# INLINE mergeWith' #-}
906mergeWith' :: Reflex t => (a -> b) -> (b -> b -> b) -> [Event t a] -> Event t b
910mergeWith' :: Reflex t => (a -> b) -> (b -> b -> b) -> [Event t a] -> Event t b
911+mergeWith' _ _ [] = never
912+mergeWith' f _ [e] = fmap f e
907mergeWith' f g es = fmap (Prelude.foldl1 g . fmap f)
913mergeWith' f g es = fmap (Prelude.foldl1 g . fmap f)
908 . mergeInt
914 . mergeInt
909 . IntMap.fromDistinctAscList
915 . IntMap.fromDistinctAscList
@@ -921,6 +927,7 @@ leftmost = mergeWith const
922mergeList :: Reflex t => [Event t a] -> Event t (NonEmpty a)
928mergeList :: Reflex t => [Event t a] -> Event t (NonEmpty a)
923mergeList [] = never
929mergeList [] = never
930+mergeList [e] = fmapCheap (:|[]) e
924mergeList es = mergeWithFoldCheap' id es
931mergeList es = mergeWithFoldCheap' id es
926unsafeMapIncremental
933unsafeMapIncremental
@@ -1017,7 +1024,11 @@ switchHoldPromptly ea0 eea = do
1017switchHoldPromptOnly :: (Reflex t, MonadHold t m) => Event t a -> Event t (Event t a) -> m (Event t a)
1024switchHoldPromptOnly :: (Reflex t, MonadHold t m) => Event t a -> Event t (Event t a) -> m (Event t a)
1018switchHoldPromptOnly e0 e' = do
1025switchHoldPromptOnly e0 e' = do
1019 eLag <- switch <$> hold e0 e'
1026 eLag <- switch <$> hold e0 e'
1020− return $ coincidence $ leftmost [e', eLag <$ eLag]
1027+ return $ fmapMaybeCheap id $ leftmost
1028+ [ fmapCheap Just $ coincidence e'
1029+ , fmapCheap (const Nothing) e'
1030+ , fmapCheap Just eLag
1022-- | When the given outer event fires, condense the inner events into the contained patch. Non-firing inner events will be replaced with deletions.
1033-- | When the given outer event fires, condense the inner events into the contained patch. Non-firing inner events will be replaced with deletions.
1023coincidencePatchMap :: (Reflex t, Ord k) => Event t (PatchMap k (Event t v)) -> Event t (PatchMap k v)
1034coincidencePatchMap :: (Reflex t, Ord k) => Event t (PatchMap k (Event t v)) -> Event t (PatchMap k v)
@@ -1649,6 +1660,8 @@ mergeWithCheap' f g = mergeWithFoldCheap' $ foldl1 g . fmap f
1649-- | A "cheap" version of 'mergeWithFoldCheap''. See the performance note on 'pushCheap'.
1660-- | A "cheap" version of 'mergeWithFoldCheap''. See the performance note on 'pushCheap'.
1650{-# INLINE mergeWithFoldCheap' #-}
1661{-# INLINE mergeWithFoldCheap' #-}
1651mergeWithFoldCheap' :: Reflex t => (NonEmpty a -> b) -> [Event t a] -> Event t b
1662mergeWithFoldCheap' :: Reflex t => (NonEmpty a -> b) -> [Event t a] -> Event t b
1663+mergeWithFoldCheap' f [] = never
1664+mergeWithFoldCheap' f [e] = fmapCheap (f . (:|[])) e
1652mergeWithFoldCheap' f es =
1665mergeWithFoldCheap' f es =
1653 fmapCheap (f . (\(h : t) -> h :| t) . IntMap.elems)
1666 fmapCheap (f . (\(h : t) -> h :| t) . IntMap.elems)
1654 . mergeInt
1667 . mergeInt