content: -- |
  -- Module      : Streamly.Internal.Data.Cont
  -- Copyright   : (c) 2020 Composewell Technologies
  -- License     : BSD-3-Clause
  -- Maintainer  : streamly@composewell.com
  -- Stability   : experimental
  -- Portability : GHC
  --
  -- Continuation style utilities.
  --
  module Streamly.Internal.Data.Cont
      ( contListMap
      )
  where
  
  import Control.Monad.Cont (runCont, cont)
  
  -- | Given a continuation based transformation from @a@ to @b@ and a
  -- continuation based transformation from @[b]@ to @c@, make continuation based
  -- transformation from @[a]@ to @c@.
  --
  -- /Pre-release/
  
  -- You can read the definition as:
  --
  -- > contListMap f g = \xs final ->
  --
  contListMap ::
         (a -> (b -> r) -> r)      -- transform a -> b
      -> ([b] -> (c -> r) -> r)    -- transform [b] -> c
      -> ([a] -> (c -> r) -> r)    -- transform [a] -> c
  contListMap f g xs final =
      let bconts = fmap (cont . f) xs  -- [Cont b]
          blistCont = sequence bconts  -- Cont [b]
          k ys = g ys final            -- [b] -> r
       in runCont blistCont k          -- r
  