diff --git a/hw-streams.cabal b/hw-streams.cabal
--- a/hw-streams.cabal
+++ b/hw-streams.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hw-streams
-version:        0.0.0.3
+version:        0.0.0.4
 synopsis:       Primitive functions and data types
 description:    Primitive functions and data types.
 category:       Data
diff --git a/src/HaskellWorks/Data/Streams/Stream.hs b/src/HaskellWorks/Data/Streams/Stream.hs
--- a/src/HaskellWorks/Data/Streams/Stream.hs
+++ b/src/HaskellWorks/Data/Streams/Stream.hs
@@ -1,5 +1,6 @@
-{-# LANGUAGE CPP   #-}
-{-# LANGUAGE GADTs #-}
+{-# LANGUAGE CPP        #-}
+{-# LANGUAGE GADTs      #-}
+{-# LANGUAGE RankNTypes #-}
 
 module HaskellWorks.Data.Streams.Stream where
 
@@ -110,3 +111,15 @@
           Done       -> Done
         {-# INLINE step' #-}
 {-# INLINE transcribe #-}
+
+concatMap :: (a -> Stream b) -> Stream a -> Stream b
+concatMap f (Stream stepA stateA _) = Stream stepC (stateA, Nothing) Unknown
+  where stepC (stateA0, Nothing) = case stepA stateA0 of
+          Yield a stateA1 -> Skip (stateA1, Just (f a))
+          Skip    stateA1 -> Skip (stateA1, Nothing)
+          Done            -> Done
+        stepC (stateA0, Just (Stream stepB stateB _)) = case stepB stateB of
+          Yield b stateB1 -> Yield b  (stateA0, Just (Stream stepB stateB1 Unknown))
+          Skip    stateB1 -> Skip     (stateA0, Just (Stream stepB stateB1 Unknown))
+          Done            -> Skip     (stateA0, Nothing)
+{-# INLINE concatMap #-}
