{-# OPTIONS_GHC -Wno-orphans #-}
module ClickHaskell.Primitive.TFloat where

-- Internal
import ClickHaskell.Primitive.Serialization

-- GHC included
import Data.Binary.Get
import Data.ByteString.Builder
import Data.ByteString.Char8 as BS8 (pack)
import Prelude hiding (liftA2)

-- External
import Data.Binary.Put (putFloatle, putDoublele, execPut)


-- * Float32

type Float32 = Float

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

instance Serializable Float32 where
  serialize :: ProtocolRevision -> Float32 -> Builder
serialize ProtocolRevision
_ Float32
f32 = (PutM () -> Builder
forall a. PutM a -> Builder
execPut (PutM () -> Builder) -> (Float32 -> PutM ()) -> Float32 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float32 -> PutM ()
putFloatle) Float32
f32
  deserialize :: ProtocolRevision -> Get Float32
deserialize ProtocolRevision
_ = Get Float32
getFloatle
  {-# INLINE deserialize #-}

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



-- * Float64

type Float64 = Double

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

instance Serializable Float64 where
  serialize :: ProtocolRevision -> Float64 -> Builder
serialize ProtocolRevision
_ Float64
f64 = (PutM () -> Builder
forall a. PutM a -> Builder
execPut (PutM () -> Builder) -> (Float64 -> PutM ()) -> Float64 -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Float64 -> PutM ()
putDoublele) Float64
f64
  deserialize :: ProtocolRevision -> Get Float64
deserialize ProtocolRevision
_ = Get Float64
getDoublele
  {-# INLINE deserialize #-}

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