{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE UnicodeSyntax #-}

{-| This module contains a type that specializes the 'Sum' 'Monoid' to 'Word'. -}
module LogicGrowsOnTrees.Utils.WordSum where

import Data.List (foldl')
import Data.Monoid (Monoid(..))
import Data.Serialize (Serialize(..))
import Data.Typeable (Typeable)
import Data.Word (Word)

{-| An unpacked 'Word' whose 'Monoid' instance is addition. -}
data WordSum = WordSum { getWordSum :: {-# UNPACK #-} !Word } deriving (Eq,Show,Typeable)

{-| This instance sums the two contained 'Word's. -}
instance Monoid WordSum where
    mempty = WordSum 0
    WordSum x `mappend` WordSum y = WordSum (x+y)
    mconcat = foldl' mappend mempty

{-| This instance is equivalent to the instance for 'Word'. -}
instance Serialize WordSum where
    put = put . getWordSum
    get = fmap WordSum get