Extras.hs 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. module Control.Monad.Extras (
  2. ifM,
  3. unlessM,
  4. whenM,
  5. intercalateM
  6. )where
  7. import Control.Monad
  8. import Control.Applicative
  9. ifThenElse :: Bool -> a -> a -> a
  10. ifThenElse i t e = if i then t else e
  11. -- | A version of if with monadic test.
  12. ifM :: Monad m => m Bool -> m a -> m a -> m a
  13. ifM i t e = do
  14. i' <- i
  15. if i' then t else e
  16. -- | A version of unless with monadic test
  17. unlessM :: Monad m => m Bool -> m () -> m ()
  18. unlessM p me = do
  19. p' <- p
  20. unless p' me
  21. -- | A version of when with monadic test
  22. whenM :: Monad m => m Bool -> m () -> m ()
  23. whenM p me = do
  24. p' <- p
  25. when p' me
  26. {- |
  27. Folds the second list with the function applied to the first,
  28. intercalating the evaluation. That is:
  29. intercalateM f -> [a00, a10, a20] -> [b1, b2] = do
  30. a01 <- f a00 b1
  31. a11 <- f a10 b1
  32. a21 <- f a20 b1
  33. a02 <- f a11 b2
  34. a12 <- f a21 b2
  35. a22 <- f a31 b2
  36. return [a02, a12, a22]
  37. Usefull for consuming lazy sequences.
  38. -}
  39. intercalateM :: Monad m => (a -> b -> m a) -> [a] -> [b] -> m [a]
  40. intercalateM _ aa [] = return aa
  41. intercalateM f aa (b:bb) = do
  42. aa' <- sequence $ f <$> aa <*> [b]
  43. intercalateM f aa' bb