packages feed

midi-0.2.2.2: src/Sound/MIDI/Monoid.hs

module Sound.MIDI.Monoid where

import Data.Foldable (foldMap, )
import Data.Monoid (Monoid, mappend, )
import Data.Semigroup (Semigroup, sconcat, )
import Data.List.NonEmpty (NonEmpty, )



infixr 5 +#+

(+#+) :: Monoid m => m -> m -> m
(+#+) = mappend


genAppend :: (Monoid m) =>
   (m -> a) -> (a -> m) -> a -> a -> a
genAppend cons decons x y =
   cons $ mappend (decons x) (decons y)

genConcat :: (Monoid m) =>
   (m -> a) -> (a -> m) -> [a] -> a
genConcat cons decons =
   cons . foldMap decons

nonEmptyConcat :: (Semigroup m) =>
   (m -> a) -> (a -> m) -> NonEmpty a -> a
nonEmptyConcat cons decons =
   cons . sconcat . fmap decons