module Rattletrap.Type.RemoteId.QQ where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.U64 as U64
import qualified Rattletrap.Utility.Json as Json

newtype QQ
  = QQ U64.U64
  deriving (QQ -> QQ -> Bool
(QQ -> QQ -> Bool) -> (QQ -> QQ -> Bool) -> Eq QQ
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: QQ -> QQ -> Bool
== :: QQ -> QQ -> Bool
$c/= :: QQ -> QQ -> Bool
/= :: QQ -> QQ -> Bool
Eq, Int -> QQ -> ShowS
[QQ] -> ShowS
QQ -> String
(Int -> QQ -> ShowS)
-> (QQ -> String) -> ([QQ] -> ShowS) -> Show QQ
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> QQ -> ShowS
showsPrec :: Int -> QQ -> ShowS
$cshow :: QQ -> String
show :: QQ -> String
$cshowList :: [QQ] -> ShowS
showList :: [QQ] -> ShowS
Show)

instance Json.FromJSON QQ where
  parseJSON :: Value -> Parser QQ
parseJSON = (U64 -> QQ) -> Parser U64 -> Parser QQ
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap U64 -> QQ
fromU64 (Parser U64 -> Parser QQ)
-> (Value -> Parser U64) -> Value -> Parser QQ
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser U64
forall a. FromJSON a => Value -> Parser a
Json.parseJSON

instance Json.ToJSON QQ where
  toJSON :: QQ -> Value
toJSON = U64 -> Value
forall a. ToJSON a => a -> Value
Json.toJSON (U64 -> Value) -> (QQ -> U64) -> QQ -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QQ -> U64
toU64

fromU64 :: U64.U64 -> QQ
fromU64 :: U64 -> QQ
fromU64 = U64 -> QQ
QQ

toU64 :: QQ -> U64.U64
toU64 :: QQ -> U64
toU64 (QQ U64
x) = U64
x

schema :: Schema.Schema
schema :: Schema
schema = Schema
U64.schema

bitPut :: QQ -> BitPut.BitPut
bitPut :: QQ -> BitPut
bitPut = U64 -> BitPut
U64.bitPut (U64 -> BitPut) -> (QQ -> U64) -> QQ -> BitPut
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QQ -> U64
toU64

bitGet :: BitGet.BitGet QQ
bitGet :: BitGet QQ
bitGet = String -> BitGet QQ -> BitGet QQ
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"QQ" (BitGet QQ -> BitGet QQ) -> BitGet QQ -> BitGet QQ
forall a b. (a -> b) -> a -> b
$ (U64 -> QQ) -> Get BitString Identity U64 -> BitGet QQ
forall a b.
(a -> b) -> Get BitString Identity a -> Get BitString Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap U64 -> QQ
fromU64 Get BitString Identity U64
U64.bitGet