A Producer is some monadic action that can yield values for downstream consumption:
type Producer b = Proxy X () () b
yield :: Monad m => a -> Producer a m ()
For example:
naturals :: Monad m => Producer Int m ()
naturals = each [1..] -- each is a utility function exported by Pipes
We can of course have Producers that are functions of other values too:
naturalsUntil :: Monad m => Int -> Producer Int m ()
naturalsUntil n = each [1..n]