@@ -53,14 +53,15 @@ module Colog.Core.Action
53
53
, (<<=)
54
54
, duplicate
55
55
, multiplicate
56
+ , separate
56
57
57
58
-- * Higher-order combinators
58
59
, hoistLogAction
59
60
) where
60
61
61
62
import Control.Monad (when , (<=<) , (>=>) )
62
63
import Data.Coerce (coerce )
63
- import Data.Foldable (fold , for_ )
64
+ import Data.Foldable (fold , for_ , traverse_ )
64
65
import Data.List.NonEmpty (NonEmpty (.. ))
65
66
import Data.Monoid (Monoid (.. ))
66
67
import Data.Semigroup (Semigroup (.. ), stimesMonoid )
@@ -619,6 +620,34 @@ multiplicate (LogAction l) = LogAction $ \msgs -> l (fold msgs)
619
620
{-# SPECIALIZE multiplicate :: Monoid msg => LogAction m msg -> LogAction m [msg] #-}
620
621
{-# SPECIALIZE multiplicate :: Monoid msg => LogAction m msg -> LogAction m (NonEmpty msg) #-}
621
622
623
+ {- | Like 'multiplicate' but instead of logging a batch of messages it logs each
624
+ of them separately.
625
+
626
+ >>> :{
627
+ let logger :: LogAction IO Int
628
+ logger = logPrint
629
+ in separate logger <& [1..5]
630
+ :}
631
+ 1
632
+ 2
633
+ 3
634
+ 4
635
+ 5
636
+
637
+ @since 0.2.1.0
638
+ -}
639
+ separate
640
+ :: forall f msg m .
641
+ (Traversable f , Applicative m )
642
+ => LogAction m msg
643
+ -> LogAction m (f msg )
644
+ separate (LogAction action) = LogAction (traverse_ action)
645
+ {-# INLINE separate #-}
646
+ {-# SPECIALIZE separate :: Applicative m => LogAction m msg -> LogAction m [msg] #-}
647
+ {-# SPECIALIZE separate :: Applicative m => LogAction m msg -> LogAction m (NonEmpty msg) #-}
648
+ {-# SPECIALIZE separate :: LogAction IO msg -> LogAction IO [msg] #-}
649
+ {-# SPECIALIZE separate :: LogAction IO msg -> LogAction IO (NonEmpty msg) #-}
650
+
622
651
{- | Allows changing the internal monadic action.
623
652
624
653
Let's say we have a pure logger action using 'PureLogger'
0 commit comments