-- | This provides instance of 'Mergeable' for the basic field types.
module Text.ProtocolBuffers.Mergeable() where

import Text.ProtocolBuffers.Basic
-- import Data.Monoid(mempty,mappend)
import Data.Sequence(empty,(><))

-- Base types are not very mergeable, but their Maybe and Seq versions are:
instance Mergeable a => Mergeable (Maybe a) where
    mergeEmpty = Nothing
    mergeAppend = mayMerge

instance Mergeable (Seq a) where
    mergeEmpty = empty
    mergeAppend = (><)

-- These all have errors as mergeEmpty and use the second paramater for mergeAppend
instance Mergeable Bool
instance Mergeable Utf8
instance Mergeable ByteString
instance Mergeable Double
instance Mergeable Float
instance Mergeable Int32
instance Mergeable Int64
instance Mergeable Word32
instance Mergeable Word64

{-# INLINE mayMerge #-}
mayMerge :: (Mergeable b) => Maybe b -> Maybe b -> Maybe b
mayMerge Nothing  y        = y
mayMerge x        Nothing  = x
mayMerge (Just x) (Just y) = Just (mergeAppend x y)