{-# OPTIONS_GHC -Wno-orphans #-}
module ClickHaskell.Primitive.TInt
  ( Int8, Int16, Int32, Int64, Int128, Int256
  ) where

-- Internal
import ClickHaskell.Primitive.Serialization

-- GHC included
import Data.Int (Int8, Int16, Int32, Int64)
import Data.ByteString.Builder (byteString, int8, int16LE, int32LE, int64LE, word64LE)
import Data.ByteString.Char8 as BS8 (pack)

-- External
import Data.Binary.Get (getInt8, getInt16le, getInt32le, getInt64le, getWord64le)
import Data.WideWord


instance IsChType Int8 where
  chTypeName :: String
chTypeName = String
"Int8"
  defaultValueOfTypeName :: Int8
defaultValueOfTypeName = Int8
0

instance Serializable Int8 where
  serialize :: ProtocolRevision -> Int8 -> Builder
serialize ProtocolRevision
_ = Int8 -> Builder
int8
  deserialize :: ProtocolRevision -> Get Int8
deserialize ProtocolRevision
_ = Get Int8
getInt8
  {-# INLINE deserialize #-}

instance ToQueryPart Int8 where
  toQueryPart :: Int8 -> Builder
toQueryPart = StrictByteString -> Builder
byteString (StrictByteString -> Builder)
-> (Int8 -> StrictByteString) -> Int8 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StrictByteString
BS8.pack (String -> StrictByteString)
-> (Int8 -> String) -> Int8 -> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int8 -> String
forall a. Show a => a -> String
show


-- * Int16

instance IsChType Int16 where
  chTypeName :: String
chTypeName = String
"Int16"
  defaultValueOfTypeName :: Int16
defaultValueOfTypeName = Int16
0

instance Serializable Int16 where
  serialize :: ProtocolRevision -> Int16 -> Builder
serialize ProtocolRevision
_ = Int16 -> Builder
int16LE
  deserialize :: ProtocolRevision -> Get Int16
deserialize ProtocolRevision
_ = Get Int16
getInt16le
  {-# INLINE deserialize #-}

instance ToQueryPart Int16 where
  toQueryPart :: Int16 -> Builder
toQueryPart = StrictByteString -> Builder
byteString (StrictByteString -> Builder)
-> (Int16 -> StrictByteString) -> Int16 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StrictByteString
BS8.pack (String -> StrictByteString)
-> (Int16 -> String) -> Int16 -> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int16 -> String
forall a. Show a => a -> String
show


-- * Int32

instance IsChType Int32 where
  chTypeName :: String
chTypeName = String
"Int32"
  defaultValueOfTypeName :: Int32
defaultValueOfTypeName = Int32
0

instance Serializable Int32 where
  serialize :: ProtocolRevision -> Int32 -> Builder
serialize ProtocolRevision
_ = Int32 -> Builder
int32LE
  deserialize :: ProtocolRevision -> Get Int32
deserialize ProtocolRevision
_ = Get Int32
getInt32le
  {-# INLINE deserialize #-}

instance ToQueryPart Int32 where
  toQueryPart :: Int32 -> Builder
toQueryPart = StrictByteString -> Builder
byteString (StrictByteString -> Builder)
-> (Int32 -> StrictByteString) -> Int32 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StrictByteString
BS8.pack (String -> StrictByteString)
-> (Int32 -> String) -> Int32 -> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int32 -> String
forall a. Show a => a -> String
show







instance IsChType Int64 where
  chTypeName :: String
chTypeName = String
"Int64"
  defaultValueOfTypeName :: Int64
defaultValueOfTypeName = Int64
0

instance Serializable Int64 where
  serialize :: ProtocolRevision -> Int64 -> Builder
serialize ProtocolRevision
_ = Int64 -> Builder
int64LE
  deserialize :: ProtocolRevision -> Get Int64
deserialize ProtocolRevision
_ = Get Int64
getInt64le
  {-# INLINE deserialize #-}

instance ToQueryPart Int64 where
  toQueryPart :: Int64 -> Builder
toQueryPart = StrictByteString -> Builder
byteString (StrictByteString -> Builder)
-> (Int64 -> StrictByteString) -> Int64 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StrictByteString
BS8.pack (String -> StrictByteString)
-> (Int64 -> String) -> Int64 -> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> String
forall a. Show a => a -> String
show








instance IsChType Int128 where
  chTypeName :: String
chTypeName = String
"Int128"
  defaultValueOfTypeName :: Int128
defaultValueOfTypeName = Int128
0

instance Serializable Int128 where
  serialize :: ProtocolRevision -> Int128 -> Builder
serialize ProtocolRevision
_ = (\(Int128 Word64
hi Word64
lo) -> Word64 -> Builder
word64LE Word64
lo Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word64 -> Builder
word64LE Word64
hi)
  deserialize :: ProtocolRevision -> Get Int128
deserialize ProtocolRevision
_ = do
    low <- Get Word64
getWord64le
    high <- getWord64le
    pure $ Int128 high low
  {-# INLINE deserialize #-}

instance ToQueryPart Int128 where
  toQueryPart :: Int128 -> Builder
toQueryPart Int128
x = Builder
"'" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (StrictByteString -> Builder
byteString (StrictByteString -> Builder)
-> (Int128 -> StrictByteString) -> Int128 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StrictByteString
BS8.pack (String -> StrictByteString)
-> (Int128 -> String) -> Int128 -> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int128 -> String
forall a. Show a => a -> String
show) Int128
x Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"'"









instance IsChType Int256 where
  chTypeName :: String
chTypeName = String
"Int256"
  defaultValueOfTypeName :: Int256
defaultValueOfTypeName = Int256
0

instance Serializable Int256 where
  serialize :: ProtocolRevision -> Int256 -> Builder
serialize ProtocolRevision
_ = (\(Int256 Word64
a1 Word64
a2 Word64
a3 Word64
a4) -> Word64 -> Builder
word64LE Word64
a4 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word64 -> Builder
word64LE Word64
a3 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word64 -> Builder
word64LE Word64
a2 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Word64 -> Builder
word64LE Word64
a1)
  deserialize :: ProtocolRevision -> Get Int256
deserialize ProtocolRevision
_ = do
    low <- Get Word64
getWord64le
    mid1 <- getWord64le
    mid2 <- getWord64le
    high <- getWord64le
    pure $ Int256 high mid2 mid1 low
  {-# INLINE deserialize #-}

instance ToQueryPart Int256 where
  toQueryPart :: Int256 -> Builder
toQueryPart Int256
x = Builder
"'" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (StrictByteString -> Builder
byteString (StrictByteString -> Builder)
-> (Int256 -> StrictByteString) -> Int256 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StrictByteString
BS8.pack (String -> StrictByteString)
-> (Int256 -> String) -> Int256 -> StrictByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int256 -> String
forall a. Show a => a -> String
show) Int256
x Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"'"