-- |
-- Module:      Data.ProtoBuf.Mergeable
-- Copyright:   (c) 2015-2016 Martijn Rijkeboer <mrr@sru-systems.com>
-- License:     MIT
-- Maintainer:  Martijn Rijkeboer <mrr@sru-systems.com>
--
-- Mergeable typeclass

module Data.ProtoBuf.Mergeable
    ( Mergeable(..)
    ) where


import Data.ByteString.Lazy (ByteString)
import Data.Int (Int32, Int64)
import Data.Sequence (Seq, (><))
import Data.Text.Lazy (Text)
import Data.Word (Word32, Word64)


-- | Typeclass to handle merging of values.
class Mergeable a where

    -- | Merge two values.
    merge :: a -> a -> a
    merge a
_ a
b = a
b


instance Mergeable Bool
instance Mergeable ByteString
instance Mergeable Double
instance Mergeable Float
instance Mergeable Int32
instance Mergeable Int64
instance Mergeable Text
instance Mergeable Word32
instance Mergeable Word64


instance Mergeable a => Mergeable (Maybe a) where
    merge :: Maybe a -> Maybe a -> Maybe a
merge Maybe a
Nothing  Maybe a
b        = Maybe a
b
    merge Maybe a
a        Maybe a
Nothing  = Maybe a
a
    merge (Just a
a) (Just a
b) = a -> Maybe a
forall a. a -> Maybe a
Just (a -> a -> a
forall a. Mergeable a => a -> a -> a
merge a
a a
b)


instance Mergeable (Seq a) where
    merge :: Seq a -> Seq a -> Seq a
merge = Seq a -> Seq a -> Seq a
forall a. Seq a -> Seq a -> Seq a
(><)