{-# LANGUAGE
    MultiParamTypeClasses
  , FlexibleInstances
  , FlexibleContexts
  , UndecidableInstances
  #-}

{-|

Module: Test.Serialization.Symbiote.Cereal
Copyright: (c) 2019 Athan Clark
License: BSD-3-Style
Maintainer: athan.clark@gmail.com
Portability: GHC

-}

module Test.Serialization.Symbiote.Cereal where

import Test.Serialization.Symbiote (SymbioteOperation, Symbiote (..), Operation)
import qualified Data.Serialize as Cereal
import qualified Data.ByteString as BS

instance
  ( Cereal.Serialize a
  , Cereal.Serialize o
  , Cereal.Serialize (Operation a)
  , SymbioteOperation a o
  ) => Symbiote a o BS.ByteString where
  encode = Cereal.encode
  decode x = case Cereal.decode x of
    Left _ -> Nothing
    Right y -> Just y
  encodeOp = Cereal.encode
  decodeOp x = case Cereal.decode x of
    Left _ -> Nothing
    Right y -> Just y
  encodeOut _ = Cereal.encode
  decodeOut _ x = case Cereal.decode x of
    Left _ -> Nothing
    Right y -> Just y