packages feed

grisette-0.13.0.1: src/Grisette/Internal/TH/Derivation/DeriveCereal.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}

{-# HLINT ignore "Unused LANGUAGE pragma" #-}

-- |
-- Module      :   Grisette.Internal.TH.Derivation.DeriveCereal
-- Copyright   :   (c) Sirui Lu 2024
-- License     :   BSD-3-Clause (see the LICENSE file)
--
-- Maintainer  :   siruilu@cs.washington.edu
-- Stability   :   Experimental
-- Portability :   GHC only
module Grisette.Internal.TH.Derivation.DeriveCereal (deriveCereal) where

import Data.Serialize (Serialize (get, put))
import Grisette.Internal.TH.Derivation.Common
  ( DeriveConfig (useSerialForCerealAndBinary),
  )
import Grisette.Internal.TH.Derivation.SerializeCommon
  ( serializeConfig,
    serializeWithSerialConfig,
  )
import Grisette.Internal.TH.Derivation.UnaryOpCommon
  ( UnaryOpClassConfig,
    genUnaryOpClass,
  )
import Language.Haskell.TH (Dec, Name, Q)

cerealConfig :: UnaryOpClassConfig
cerealConfig = serializeConfig [''Serialize] ['put] ['get]

cerealWithSerialConfig :: UnaryOpClassConfig
cerealWithSerialConfig =
  serializeWithSerialConfig [''Serialize] ['put] ['get]

-- | Derive 'Serialize' instance for a data type.
deriveCereal :: DeriveConfig -> Name -> Q [Dec]
deriveCereal deriveConfig =
  genUnaryOpClass
    deriveConfig
    ( if useSerialForCerealAndBinary deriveConfig
        then cerealWithSerialConfig
        else cerealConfig
    )
    0