{-# LANGUAGE UndecidableInstances, FlexibleContexts, MultiParamTypeClasses, FlexibleInstances #-}
module Data.Monoid.Reducer.Char
    ( module Data.Monoid.Reducer
    , CharReducer
    , invalidChar
    , fromChar
    ) where

import Data.Monoid.Reducer
import Data.Word (Word8)

class Reducer Char m => CharReducer m where
    fromChar :: Char -> m 
    fromChar = unit

    invalidChar :: [Word8] -> m
    invalidChar = const mempty

instance (CharReducer m, CharReducer m') =>  CharReducer (m,m') where
    invalidChar bs = (invalidChar bs, invalidChar bs)

instance (CharReducer m, CharReducer m', CharReducer m'') =>  CharReducer (m,m',m'') where
    invalidChar bs = (invalidChar bs, invalidChar bs, invalidChar bs)

instance (CharReducer m, CharReducer m', CharReducer m'', CharReducer m''') =>  CharReducer (m,m',m'',m''') where
    invalidChar bs = (invalidChar bs, invalidChar bs, invalidChar bs, invalidChar bs)

instance CharReducer [Char]