diff --git a/combinators.cabal b/combinators.cabal
--- a/combinators.cabal
+++ b/combinators.cabal
@@ -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
diff --git a/src/library/Combinators.hs b/src/library/Combinators.hs
--- a/src/library/Combinators.hs
+++ b/src/library/Combinators.hs
@@ -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
