combinators 0.1 → 0.1.1
raw patch · 2 files changed
+36/−3 lines, 2 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Combinators: intercalate :: (Foldable f, Monoid a) => a -> f a -> a
+ Combinators: intercalateMap :: (Foldable f, Monoid m) => m -> (a -> m) -> f a -> m
+ Combinators: itraverse :: (Traversable f, Monad m) => (Int -> a -> m b) -> f a -> m (f b)
- Combinators: iforM :: (Monad m, Traversable f) => f a -> (Int -> a -> m b) -> m (f b)
+ Combinators: iforM :: (Traversable f, Monad m) => f a -> (Int -> a -> m b) -> m (f b)
Files
- combinators.cabal +2/−2
- src/library/Combinators.hs +34/−1
combinators.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: combinators-version: 0.1+version: 0.1.1 synopsis: Collection of combinators over standard typeclasses homepage: https://github.com/nikita-volkov/combinators bug-reports: https://github.com/nikita-volkov/combinators/issues@@ -12,7 +12,7 @@ source-repository head type: git- location: git://github.com/nikita-volkov/combinators.git+ location: https://github.com/nikita-volkov/combinators common base default-language: Haskell2010
src/library/Combinators.hs view
@@ -3,10 +3,13 @@ import Control.Applicative import Control.Monad import Control.Monad.State.Strict+import Data.Bool import Data.Foldable import Data.Function import Data.Int+import Data.Monoid import Data.Traversable+import Data.Tuple import GHC.Enum -- * Alternation@@ -36,12 +39,36 @@ where cons a b = mapper a <|> b +-- * Folding++-- |+-- A generic version of the original list-specialized version:+--+-- > intercalate :: [a] -> [[a]] -> [a]+{-# INLINE intercalate #-}+intercalate :: (Foldable f, Monoid a) => a -> f a -> a+intercalate = flip intercalateMap id++-- |+-- 'intercalate' extended with ability to map the wrapped value.+{-# INLINE intercalateMap #-}+intercalateMap :: (Foldable f, Monoid m) => m -> (a -> m) -> f a -> m+intercalateMap separator proj =+ fst+ . foldl'+ ( \(acc, isFirst) element ->+ if isFirst+ then (proj element, False)+ else (acc <> separator <> proj element, False)+ )+ (mempty, True)+ -- * Traversal -- | -- Indexed version of 'forM'. {-# INLINE iforM #-}-iforM :: (Monad m, Traversable f) => f a -> (Int -> a -> m b) -> m (f b)+iforM :: (Traversable f, Monad m) => f a -> (Int -> a -> m b) -> m (f b) iforM collection f = collection & traverse@@ -50,3 +77,9 @@ lift (f i item) ) & flip evalStateT 0++-- |+-- Indexed version of 'traverse'.+{-# INLINE itraverse #-}+itraverse :: (Traversable f, Monad m) => (Int -> a -> m b) -> f a -> m (f b)+itraverse = flip iforM