{-# LANGUAGE FlexibleInstances #-}
module Data.Monoid.Space (
    SpaceMonoid(..)
  , smappend
  , smconcat
  , (<+>)
  ) where

import Data.Monoid
import qualified Data.Text as T
import qualified Data.ByteString as BS

import Data.Monoid.Utils

-- | Extension of 'Monoid' which abstracts the notion of \'separator\'.
class Monoid m => SpaceMonoid m where
  mspace :: m

instance SpaceMonoid String where
  mspace = " "

instance SpaceMonoid BS.ByteString where
  mspace = BS.singleton 32

instance SpaceMonoid T.Text where
  mspace = T.singleton ' '

----------------------------------------

-- | Concatenate two elements with separator between them.
smappend :: SpaceMonoid m => m -> m -> m
smappend a b = mconcat [a, mspace, b]

-- | Concatenate a list of elements, inserting separators between them.
smconcat :: SpaceMonoid m => [m] -> m
smconcat = mintercalate mspace

-- | Infix version of 'smappend'.
(<+>) :: SpaceMonoid m => m -> m -> m
(<+>) = smappend
infixr 6 <+>