{-# LANGUAGE StandaloneDeriving, DerivingVia, TypeApplications, TypeSynonymInstances, ScopedTypeVariables #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
--Serialise instances for ProjectM36.Base data types- orphan instance city
module ProjectM36.Serialise.Base where
import Codec.Winery hiding (Schema)
import Codec.Winery.Internal
import Control.Monad
import ProjectM36.Base
import ProjectM36.MerkleHash
import Data.UUID
import Data.Proxy
import Data.Word
import ProjectM36.Attribute as A
import qualified Data.List.NonEmpty as NE
import qualified Data.Vector as V
import Data.Time.Calendar (Day,toGregorian,fromGregorian)

deriving via WineryVariant Atom instance Serialise Atom
deriving via WineryVariant AtomType instance Serialise AtomType
deriving via WineryVariant Attribute instance Serialise Attribute
deriving via WineryVariant RelationTupleSet instance Serialise RelationTupleSet
deriving via WineryVariant RelationTuple instance Serialise RelationTuple
deriving via WineryVariant Relation instance Serialise Relation
deriving via WineryVariant RelationCardinality instance Serialise RelationCardinality
deriving via WineryVariant (RelationalExprBase a) instance Serialise a => Serialise (RelationalExprBase a)
deriving via WineryVariant (WithNameExprBase a) instance Serialise a => Serialise (WithNameExprBase a)
deriving via WineryVariant Notification instance Serialise Notification
deriving via WineryVariant TypeConstructorDef instance Serialise TypeConstructorDef
deriving via WineryVariant (TypeConstructorBase a) instance Serialise a => Serialise (TypeConstructorBase a)
deriving via WineryVariant DataConstructorDef instance Serialise DataConstructorDef
deriving via WineryVariant DataConstructorDefArg instance Serialise DataConstructorDefArg
deriving via WineryVariant GraphRefTransactionMarker instance Serialise GraphRefTransactionMarker
deriving via WineryVariant SchemaIsomorph instance Serialise SchemaIsomorph
deriving via WineryVariant InclusionDependency instance Serialise InclusionDependency
deriving via WineryVariant (DatabaseContextExprBase a) instance Serialise a => Serialise (DatabaseContextExprBase a)
deriving via WineryVariant (DatabaseContextIOExprBase a) instance Serialise a => Serialise (DatabaseContextIOExprBase a)
deriving via WineryVariant (RestrictionPredicateExprBase a) instance Serialise a => Serialise (RestrictionPredicateExprBase a)
deriving via WineryVariant TransactionInfo instance Serialise TransactionInfo
deriving via WineryVariant (AtomExprBase a) instance Serialise a => Serialise (AtomExprBase a)
deriving via WineryVariant MerkleHash instance Serialise MerkleHash
deriving via WineryVariant (AttributeExprBase a) instance Serialise a => Serialise (AttributeExprBase a)
deriving via WineryVariant (TupleExprsBase a) instance Serialise a => Serialise (TupleExprsBase a)
deriving via WineryVariant (TupleExprBase a) instance Serialise a => Serialise (TupleExprBase a)
deriving via WineryVariant (AttributeNamesBase a) instance Serialise a => Serialise (AttributeNamesBase a)
deriving via WineryVariant (ExtendTupleExprBase a) instance Serialise a => Serialise (ExtendTupleExprBase a)
deriving via WineryVariant Schema instance Serialise Schema
deriving via WineryVariant MergeStrategy instance Serialise MergeStrategy

fromWordsTup :: (Word32, Word32, Word32, Word32) -> TransactionId
fromWordsTup :: (Word32, Word32, Word32, Word32) -> TransactionId
fromWordsTup (Word32
a,Word32
b,Word32
c,Word32
d) = Word32 -> Word32 -> Word32 -> Word32 -> TransactionId
fromWords Word32
a Word32
b Word32
c Word32
d

instance Serialise TransactionId where
  schemaGen :: Proxy TransactionId -> SchemaGen Schema
schemaGen Proxy TransactionId
_ = Proxy (Word32, Word32, Word32, Word32) -> SchemaGen Schema
forall (proxy :: * -> *) a.
Serialise a =>
proxy a -> SchemaGen Schema
getSchema (Proxy (Word32, Word32, Word32, Word32)
forall k (t :: k). Proxy t
Proxy @(Word32, Word32, Word32, Word32))
  toBuilder :: TransactionId -> Builder
toBuilder TransactionId
uuid = (Word32, Word32, Word32, Word32) -> Builder
forall a. Serialise a => a -> Builder
toBuilder (TransactionId -> (Word32, Word32, Word32, Word32)
toWords TransactionId
uuid)
  extractor :: Extractor TransactionId
extractor = (Word32, Word32, Word32, Word32) -> TransactionId
fromWordsTup ((Word32, Word32, Word32, Word32) -> TransactionId)
-> Extractor (Word32, Word32, Word32, Word32)
-> Extractor TransactionId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Extractor (Word32, Word32, Word32, Word32)
forall a. Serialise a => Extractor a
extractor
  decodeCurrent :: Decoder TransactionId
decodeCurrent = (Word32, Word32, Word32, Word32) -> TransactionId
fromWordsTup ((Word32, Word32, Word32, Word32) -> TransactionId)
-> Decoder (Word32, Word32, Word32, Word32)
-> Decoder TransactionId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder (Word32, Word32, Word32, Word32)
forall a. Serialise a => Decoder a
decodeCurrent

instance Serialise a => Serialise (NE.NonEmpty a) where
  schemaGen :: Proxy (NonEmpty a) -> SchemaGen Schema
schemaGen Proxy (NonEmpty a)
_ = Schema -> Schema
forall a. SchemaP a -> SchemaP a
SVector (Schema -> Schema) -> SchemaGen Schema -> SchemaGen Schema
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy a -> SchemaGen Schema
forall (proxy :: * -> *) a.
Serialise a =>
proxy a -> SchemaGen Schema
getSchema (Proxy a
forall k (t :: k). Proxy t
Proxy @a)
  toBuilder :: NonEmpty a -> Builder
toBuilder NonEmpty a
xs = Int -> Builder
forall a. (Bits a, Integral a) => a -> Builder
varInt (NonEmpty a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length NonEmpty a
xs) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (a -> Builder) -> NonEmpty a -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> Builder
forall a. Serialise a => a -> Builder
toBuilder NonEmpty a
xs
  extractor :: Extractor (NonEmpty a)
extractor = [a] -> NonEmpty a
forall a. [a] -> NonEmpty a
NE.fromList ([a] -> NonEmpty a) -> (Vector a -> [a]) -> Vector a -> NonEmpty a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> [a]
forall a. Vector a -> [a]
V.toList (Vector a -> NonEmpty a)
-> Extractor (Vector a) -> Extractor (NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Extractor a -> Extractor (Vector a)
forall a. Typeable a => Extractor a -> Extractor (Vector a)
extractListBy Extractor a
forall a. Serialise a => Extractor a
extractor --use nonempty instead to replace error with winery error
  decodeCurrent :: Decoder (NonEmpty a)
decodeCurrent = do
    Int
n <- Decoder Int
forall a. (Num a, Bits a) => Decoder a
decodeVarInt
    [a]
l <- Int -> Decoder a -> Decoder [a]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n Decoder a
forall a. Serialise a => Decoder a
decodeCurrent
    NonEmpty a -> Decoder (NonEmpty a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> NonEmpty a
forall a. [a] -> NonEmpty a
NE.fromList [a]
l)

fromGregorianTup :: (Integer, Int, Int) -> Day
fromGregorianTup :: (Integer, Int, Int) -> Day
fromGregorianTup (Integer
a, Int
b, Int
c) = Integer -> Int -> Int -> Day
fromGregorian Integer
a Int
b Int
c

instance Serialise Day where
  schemaGen :: Proxy Day -> SchemaGen Schema
schemaGen Proxy Day
_ = Proxy (Integer, Int, Int) -> SchemaGen Schema
forall (proxy :: * -> *) a.
Serialise a =>
proxy a -> SchemaGen Schema
getSchema (Proxy (Integer, Int, Int)
forall k (t :: k). Proxy t
Proxy @(Integer, Int, Int))
  toBuilder :: Day -> Builder
toBuilder Day
day = (Integer, Int, Int) -> Builder
forall a. Serialise a => a -> Builder
toBuilder (Day -> (Integer, Int, Int)
toGregorian Day
day)
  extractor :: Extractor Day
extractor = (Integer, Int, Int) -> Day
fromGregorianTup ((Integer, Int, Int) -> Day)
-> Extractor (Integer, Int, Int) -> Extractor Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Extractor (Integer, Int, Int)
forall a. Serialise a => Extractor a
extractor
  decodeCurrent :: Decoder Day
decodeCurrent = (Integer, Int, Int) -> Day
fromGregorianTup ((Integer, Int, Int) -> Day)
-> Decoder (Integer, Int, Int) -> Decoder Day
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder (Integer, Int, Int)
forall a. Serialise a => Decoder a
decodeCurrent

instance Serialise Attributes where
  schemaGen :: Proxy Attributes -> SchemaGen Schema
schemaGen Proxy Attributes
_ = Schema -> Schema
forall a. SchemaP a -> SchemaP a
SVector (Schema -> Schema) -> SchemaGen Schema -> SchemaGen Schema
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy Attribute -> SchemaGen Schema
forall (proxy :: * -> *) a.
Serialise a =>
proxy a -> SchemaGen Schema
getSchema (Proxy Attribute
forall k (t :: k). Proxy t
Proxy @Attribute)
  toBuilder :: Attributes -> Builder
toBuilder Attributes
attrs = Int -> Builder
forall a. (Bits a, Integral a) => a -> Builder
varInt (Vector Attribute -> Int
forall a. Vector a -> Int
V.length (Attributes -> Vector Attribute
attributesVec Attributes
attrs)) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (Attribute -> Builder) -> [Attribute] -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Attribute -> Builder
forall a. Serialise a => a -> Builder
toBuilder (Vector Attribute -> [Attribute]
forall a. Vector a -> [a]
V.toList (Attributes -> Vector Attribute
attributesVec Attributes
attrs))
  extractor :: Extractor Attributes
extractor =
    [Attribute] -> Attributes
attributesFromList ([Attribute] -> Attributes)
-> (Vector Attribute -> [Attribute])
-> Vector Attribute
-> Attributes
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Attribute -> [Attribute]
forall a. Vector a -> [a]
V.toList (Vector Attribute -> Attributes)
-> Extractor (Vector Attribute) -> Extractor Attributes
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Extractor Attribute -> Extractor (Vector Attribute)
forall a. Typeable a => Extractor a -> Extractor (Vector a)
extractListBy Extractor Attribute
forall a. Serialise a => Extractor a
extractor

  decodeCurrent :: Decoder Attributes
decodeCurrent = do
    Int
n <- Decoder Int
forall a. (Num a, Bits a) => Decoder a
decodeVarInt
    [Attribute]
l <- Int -> Decoder Attribute -> Decoder [Attribute]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
n Decoder Attribute
forall a. Serialise a => Decoder a
decodeCurrent
    Attributes -> Decoder Attributes
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Attribute] -> Attributes
A.attributesFromList [Attribute]
l)