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
+#+ :: m -> m -> m
(+#+) = m -> m -> m
forall a. Monoid a => a -> a -> a
mappend


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

genConcat :: (Monoid m) =>
   (m -> a) -> (a -> m) -> [a] -> a
genConcat :: (m -> a) -> (a -> m) -> [a] -> a
genConcat m -> a
cons a -> m
decons =
   m -> a
cons (m -> a) -> ([a] -> m) -> [a] -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> m
decons

nonEmptyConcat :: (Semigroup m) =>
   (m -> a) -> (a -> m) -> NonEmpty a -> a
nonEmptyConcat :: (m -> a) -> (a -> m) -> NonEmpty a -> a
nonEmptyConcat m -> a
cons a -> m
decons =
   m -> a
cons (m -> a) -> (NonEmpty a -> m) -> NonEmpty a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty m -> m
forall a. Semigroup a => NonEmpty a -> a
sconcat (NonEmpty m -> m) -> (NonEmpty a -> NonEmpty m) -> NonEmpty a -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m) -> NonEmpty a -> NonEmpty m
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> m
decons