{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ExplicitNamespaces #-}
module Proto3.Suite.Types
(
Fixed(..)
, Signed(..)
, Enumerated(..)
, ForceEmit(..)
, Nested(..)
, UnpackedVec(..)
, PackedVec(..)
, NestedVec(..)
, Commented(..)
, type (//)()
) where
import Control.Applicative
import Control.DeepSeq (NFData)
import GHC.Exts (IsList(..))
import GHC.Generics
import Data.Int (Int32)
import Data.Semigroup (Semigroup)
import qualified Data.Vector as V
import GHC.TypeLits (Symbol)
import Proto3.Wire.Class (ProtoEnum(..))
import Test.QuickCheck (Arbitrary(..))
newtype Fixed a = Fixed { fixed :: a }
deriving (Show, Eq, Ord, Num, Generic, NFData, Arbitrary, Enum, Bounded
, Functor, Foldable, Traversable)
newtype Signed a = Signed { signed :: a }
deriving (Show, Eq, Ord, Num, Generic, NFData, Arbitrary, Bounded
, Functor, Foldable, Traversable)
newtype Enumerated a = Enumerated { enumerated :: Either Int32 a }
deriving (Show, Eq, Ord, Generic, NFData
, Functor, Foldable, Traversable)
instance ProtoEnum a => Arbitrary (Enumerated a) where
arbitrary = do
i <- arbitrary
return . Enumerated $ maybe (Left i) Right (toProtoEnumMay i)
newtype PackedVec a = PackedVec { packedvec :: V.Vector a }
deriving (Show, Eq, Functor, Foldable, Traversable, Ord, NFData, Applicative,
Alternative, Monoid, Semigroup)
instance IsList (PackedVec a) where
type Item (PackedVec a) = a
fromList = PackedVec . V.fromList
toList = V.toList . packedvec
instance Arbitrary a => Arbitrary (PackedVec a) where
arbitrary = fmap (PackedVec . V.fromList) arbitrary
newtype UnpackedVec a = UnpackedVec {unpackedvec :: V.Vector a }
deriving (Show, Eq, Functor, Foldable, Traversable, Ord, NFData, Applicative,
Alternative, Monoid, Semigroup)
instance IsList (UnpackedVec a) where
type Item (UnpackedVec a) = a
fromList = UnpackedVec . V.fromList
toList = V.toList . unpackedvec
instance Arbitrary a => Arbitrary (UnpackedVec a) where
arbitrary = fmap (UnpackedVec . V.fromList) arbitrary
newtype NestedVec a =
NestedVec { nestedvec :: V.Vector a }
deriving (Show, Eq, Functor, Foldable, Traversable, Ord, NFData, Applicative,
Alternative, Monoid, Semigroup)
instance IsList (NestedVec a) where
type Item (NestedVec a) = a
fromList = NestedVec . V.fromList
toList = V.toList . nestedvec
instance Arbitrary a => Arbitrary (NestedVec a) where
arbitrary = fmap (NestedVec . V.fromList) arbitrary
newtype Nested a = Nested { nested :: Maybe a }
deriving (Show, Eq, Ord, Generic, NFData, Monoid, Arbitrary, Functor, Foldable,
Traversable, Applicative, Alternative, Monad, Semigroup)
newtype ForceEmit a = ForceEmit{ forceEmit :: a }
deriving (Show, Eq, Ord, Generic, NFData, Monoid, Arbitrary, Functor, Foldable,
Traversable, Semigroup)
newtype Commented (comment :: Symbol) a = Commented { unCommented :: a }
deriving (Show, Eq, Ord, Generic, NFData, Monoid, Arbitrary, Functor, Foldable, Traversable, Semigroup)
type a // (comment :: Symbol) = Commented comment a