module Data.Monoid.Utils
  ( mintercalate
  , mspace
  , smappend
  , smconcat
  , (<+>)
  ) where

import Data.List
import Data.String

-- | Generalization of 'intercalate' to arbitrary 'Monoid'.
mintercalate :: Monoid m => m -> [m] -> m
mintercalate :: forall m. Monoid m => m -> [m] -> m
mintercalate m
m = [m] -> m
forall a. Monoid a => [a] -> a
mconcat ([m] -> m) -> ([m] -> [m]) -> [m] -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m -> [m] -> [m]
forall a. a -> [a] -> [a]
intersperse m
m

-- | Generalization of separator to arbitrary 'Monoid'.
mspace :: (IsString m, Monoid m) => m
mspace :: forall m. (IsString m, Monoid m) => m
mspace = String -> m
forall a. IsString a => String -> a
fromString String
" "

-- | Concatenate two elements with separator between them.
smappend :: (IsString m, Monoid m) => m -> m -> m
smappend :: forall m. (IsString m, Monoid m) => m -> m -> m
smappend m
a m
b = [m] -> m
forall a. Monoid a => [a] -> a
mconcat [m
a, m
forall m. (IsString m, Monoid m) => m
mspace, m
b]

-- | Concatenate a list of elements, inserting separators between them.
smconcat :: (IsString m, Monoid m) => [m] -> m
smconcat :: forall m. (IsString m, Monoid m) => [m] -> m
smconcat = m -> [m] -> m
forall m. Monoid m => m -> [m] -> m
mintercalate m
forall m. (IsString m, Monoid m) => m
mspace

-- | Infix version of 'smappend'.
(<+>) :: (IsString m, Monoid m) => m -> m -> m
<+> :: forall m. (IsString m, Monoid m) => m -> m -> m
(<+>) = m -> m -> m
forall m. (IsString m, Monoid m) => m -> m -> m
smappend

infixr 6 <+>