[added members to Data.Monoid.Generator export list ekmett@gmail.com**20090325071438] { hunk ./Data/Monoid/Generator.hs 9 + , reduce + , mtraverse_ + , mfor_ + , mmapM_ + , mforM_ + , mconcatMap hunk ./Data/Monoid/Generator.hs 25 -import Data.Monoid.Reducer hunk ./Data/Monoid/Generator.hs 79 - - hunk ./dist/doc/html/monoids/Data-Monoid-Generator.html 354 +>
reduce :: (Generator c, Reducer (Elem c) m) => c -> mSource
mtraverse_ :: (Generator c, Applicative f) => (Elem c -> f b) -> c -> f ()Source
mfor_ :: (Generator c, Applicative f) => c -> (Elem c -> f b) -> f ()Source
mmapM_ :: (Generator c, Monad m) => (Elem c -> m b) -> c -> m ()Source
mforM_ :: (Generator c, Monad m) => c -> (Elem c -> m b) -> m ()Source
mconcatMap :: Generator c => (Elem c -> [b]) -> c -> [b]Source
mconcatMapData.Monoid.GeneratormforM_Data.Monoid.Generatormfor_Data.Monoid.GeneratormmapM_Data.Monoid.Generatormtraverse_Data.Monoid.GeneratorreduceData.Monoid.Generator ) where - -import Data.Word (Word8) -import Data.Text (Text) -import Data.Foldable (fold,foldMap) -import qualified Data.Text as Text -import qualified Data.ByteString as Strict -import qualified Data.ByteString.Lazy as Lazy -import Control.Parallel.Strategies -import Data.Monoid -import Data.Monoid.Reducer -import Data.Monoid.Applicative -import Data.Monoid.Monad - --- minimal definition mapReduce or affixMapReduce -class Generator c where - type Elem c :: * - mapReduce :: (e `Reducer` m) => (Elem c -> e) -> c -> m - mapTo :: (e `Reducer` m) => (Elem c -> e) -> m -> c -> m - mapFrom :: (e `Reducer` m) => (Elem c -> e) -> c -> m -> m - - mapReduce f = mapTo f mempty - mapTo f m = mappend m . mapReduce f - mapFrom f = mappend . mapReduce f - -instance Generator Strict.ByteString where - type Elem Strict.ByteString = Word8 - mapTo f = Strict.foldl' (\a -> snoc a . f) - -instance Generator Lazy.ByteString where - type Elem Lazy.ByteString = Elem Strict.ByteString - mapReduce f = fold . parMap rwhnf (mapReduce f) . Lazy.toChunks - -instance Generator Text where - type Elem Text = Char - mapTo f = Text.foldl' (\a -> snoc a . f) - -instance Generator [c] where - type Elem [c] = c - mapReduce f = foldMap (unit . f) - -{-# SPECIALIZE reduce :: (Word8 `Reducer` m) => Strict.ByteString -> m #-} -{-# SPECIALIZE reduce :: (Word8 `Reducer` m) => Lazy.ByteString -> m #-} -{-# SPECIALIZE reduce :: (Char `Reducer` m) => Text -> m #-} --- These aren't happy, but should work -{-- RULES "reduce/fold" reduce = fold --} -{-- RULES "mapReduce/foldMap" mapReduce = foldMap --} -reduce :: (Generator c, Elem c `Reducer` m) => c -> m -reduce = mapReduce id - -mtraverse_ :: (Generator c, Applicative f) => (Elem c -> f b) -> c -> f () -mtraverse_ f = getTraversal . mapReduce f - -mfor_ :: (Generator c, Applicative f) => c -> (Elem c -> f b) -> f () -mfor_ = flip mtraverse_ - -mmapM_ :: (Generator c, Monad m) => (Elem c -> m b) -> c -> m () -mmapM_ f = getAction . mapReduce f - -mforM_ :: (Generator c, Monad m) => c -> (Elem c -> m b) -> m () -mforM_ = flip mmapM_ - -mconcatMap :: Generator c => (Elem c -> [b]) -> c -> [b] -mconcatMap = mapReduce - - + , reduce + , mtraverse_ + , mfor_ + , mmapM_ + , mforM_ + , mconcatMap + ) where + +import Data.Word (Word8) +import Data.Text (Text) +import Data.Foldable (fold,foldMap) +import qualified Data.Text as Text +import qualified Data.ByteString as Strict +import qualified Data.ByteString.Lazy as Lazy +import Control.Parallel.Strategies +import Data.Monoid +import Data.Monoid.Applicative +import Data.Monoid.Monad + +-- minimal definition mapReduce or affixMapReduce +class Generator c where + type Elem c :: * + mapReduce :: (e `Reducer` m) => (Elem c -> e) -> c -> m + mapTo :: (e `Reducer` m) => (Elem c -> e) -> m -> c -> m + mapFrom :: (e `Reducer` m) => (Elem c -> e) -> c -> m -> m + + mapReduce f = mapTo f mempty + mapTo f m = mappend m . mapReduce f + mapFrom f = mappend . mapReduce f + +instance Generator Strict.ByteString where + type Elem Strict.ByteString = Word8 + mapTo f = Strict.foldl' (\a -> snoc a . f) + +instance Generator Lazy.ByteString where + type Elem Lazy.ByteString = Elem Strict.ByteString + mapReduce f = fold . parMap rwhnf (mapReduce f) . Lazy.toChunks + +instance Generator Text where + type Elem Text = Char + mapTo f = Text.foldl' (\a -> snoc a . f) + +instance Generator [c] where + type Elem [c] = c + mapReduce f = foldMap (unit . f) + +{-# SPECIALIZE reduce :: (Word8 `Reducer` m) => Strict.ByteString -> m #-} +{-# SPECIALIZE reduce :: (Word8 `Reducer` m) => Lazy.ByteString -> m #-} +{-# SPECIALIZE reduce :: (Char `Reducer` m) => Text -> m #-} +-- These aren't happy, but should work +{-- RULES "reduce/fold" reduce = fold --} +{-- RULES "mapReduce/foldMap" mapReduce = foldMap --} +reduce :: (Generator c, Elem c `Reducer` m) => c -> m +reduce = mapReduce id + +mtraverse_ :: (Generator c, Applicative f) => (Elem c -> f b) -> c -> f () +mtraverse_ f = getTraversal . mapReduce f + +mfor_ :: (Generator c, Applicative f) => c -> (Elem c -> f b) -> f () +mfor_ = flip mtraverse_ + +mmapM_ :: (Generator c, Monad m) => (Elem c -> m b) -> c -> m () +mmapM_ f = getAction . mapReduce f + +mforM_ :: (Generator c, Monad m) => c -> (Elem c -> m b) -> m () +mforM_ = flip mmapM_ + +mconcatMap :: Generator c => (Elem c -> [b]) -> c -> [b] +mconcatMap = mapReduce }