music-score-1.6: src/Control/Monad/Compose.hs
-- |
-- Monadic composition.
--
-- Based on an operator found in /Composing Monads/ by Jones and Duponcheel (1993).
--
-- Should be moved to a separate package `control-monad-compose`.
--
module Control.Monad.Compose (
mjoin,
mbind
) where
import Control.Monad
import Data.Set (Set)
import Data.Map (Map)
import Data.Typeable
import Data.Foldable (Foldable)
import Data.Traversable (Traversable)
import qualified Data.Foldable as F
import qualified Data.Traversable as T
import qualified Data.Set as Set
import qualified Data.Map as Map
import qualified Data.List as List
-- Intution:
--
-- Starts off with m (n (m (n a)))
-- Sequences inner structure to get m (m (n (n a)))
-- Folds outer level to get m (n (n a))
-- Folds inner level to get m (n a)
mjoin :: (Monad m, Monad n, Functor m, Traversable n) => m (n (m (n a))) -> m (n a)
mjoin = fmap join . join . fmap T.sequence
mbind :: (Monad m, Monad n, Functor m, Traversable n) => (a -> m (n b)) -> m (n a) -> m (n b)
mbind = (join .) . fmap . (fmap join .) . T.mapM