(=>=) :: Monad m => PreProcessor m -> PreProcessor m -> PreProcessor m
ppA =>= ppB = \filepath -> do
  time <- getTime
  src <- getSource
  pairsA <- liftProcessor $ runPreProcessor src time (ppA filepath)
  forM_ pairsA $ \(filepathA, srcA) -> do
    pairsB <- liftProcessor $ runPreProcessor srcA time (ppB filepathA)
    mapM_ (uncurry yieldSource) pairsB

(=>=) :: Monad m => PreProcessor m -> PreProcessor m -> PreProcessor m
ppA =>= ppB = \filepath -> do
  time <- getTime
  src <- getSource
  pairsA <- liftProcessor $ runPreProcessor src time (ppA filepath)
  forM_ pairsA $ \(filepathA, srcA) -> do
    pairsB <- liftProcessor $ runPreProcessor srcA time (ppB filepathA)
    mapM_ (uncurry yieldSource) pairsB

ppA =>= ppB = \filepath -> do
  time <- getTime
  src <- getSource
  pairsA <- liftProcessor $ runPreProcessor src time (ppA filepath)
  forM_ pairsA $ \(filepathA, srcA) -> do
    pairsB <- liftProcessor $ runPreProcessor srcA time (ppB filepathA)
    mapM_ (uncurry yieldSource) pairsB
