{-# LANGUAGE FlexibleInstances, FlexibleContexts, UndecidableInstances, MultiParamTypeClasses #-}
-----------------------------------------------------------------------------
---- |
---- Module      :  Data.Monoid.Unit
---- Copyright   :  (c) Edward Kmett 2009
---- License     :  BSD-style
---- Maintainer  :  libraries@haskell.org
---- Stability   :  experimental
---- Portability :  portable
----
-----------------------------------------------------------------------------
module Data.Monoid.Unit 
    ( module Data.Monoid.Reducer
    , Unit(Unit,getUnit) 
    ) where

import Control.Functor.Pointed
import Data.Monoid.Reducer
import Data.Monoid.Reducer.Char

newtype Unit c = Unit { getUnit :: () } 

instance Monoid (Unit c) where
    mempty = Unit ()
    _ `mappend` _ = Unit ()
    mconcat _ = Unit ()

instance Reducer c (Unit c) where 
    unit _ = Unit ()
    cons _ _ = Unit ()
    snoc _ _ = Unit ()

instance CharReducer (Unit Char)

instance Functor Unit where
    fmap _ _ = Unit ()
    
instance Pointed Unit where
    point _ = Unit ()