module Rattletrap.Type.RemoteId.Splitscreen where

import qualified Data.Word as Word
import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Utility.Json as Json

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

instance Json.FromJSON Splitscreen where
  parseJSON :: Value -> Parser Splitscreen
parseJSON = (Word32 -> Splitscreen) -> Parser Word32 -> Parser Splitscreen
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Word32 -> Splitscreen
fromWord32 (Parser Word32 -> Parser Splitscreen)
-> (Value -> Parser Word32) -> Value -> Parser Splitscreen
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser Word32
forall a. FromJSON a => Value -> Parser a
Json.parseJSON

instance Json.ToJSON Splitscreen where
  toJSON :: Splitscreen -> Value
toJSON = Word32 -> Value
forall a. ToJSON a => a -> Value
Json.toJSON (Word32 -> Value)
-> (Splitscreen -> Word32) -> Splitscreen -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Splitscreen -> Word32
toWord32

fromWord32 :: Word.Word32 -> Splitscreen
fromWord32 :: Word32 -> Splitscreen
fromWord32 = Word32 -> Splitscreen
Splitscreen

toWord32 :: Splitscreen -> Word.Word32
toWord32 :: Splitscreen -> Word32
toWord32 (Splitscreen Word32
x) = Word32
x

schema :: Schema.Schema
schema :: Schema
schema = Schema
Schema.integer

bitPut :: Splitscreen -> BitPut.BitPut
bitPut :: Splitscreen -> BitPut
bitPut = Int -> Word32 -> BitPut
forall a. Bits a => Int -> a -> BitPut
BitPut.bits Int
24 (Word32 -> BitPut)
-> (Splitscreen -> Word32) -> Splitscreen -> BitPut
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Splitscreen -> Word32
toWord32

bitGet :: BitGet.BitGet Splitscreen
bitGet :: BitGet Splitscreen
bitGet = String -> BitGet Splitscreen -> BitGet Splitscreen
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"Splitscreen" (BitGet Splitscreen -> BitGet Splitscreen)
-> (Get BitString Identity Word32 -> BitGet Splitscreen)
-> Get BitString Identity Word32
-> BitGet Splitscreen
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word32 -> Splitscreen)
-> Get BitString Identity Word32 -> BitGet Splitscreen
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Word32 -> Splitscreen
fromWord32 (Get BitString Identity Word32 -> BitGet Splitscreen)
-> Get BitString Identity Word32 -> BitGet Splitscreen
forall a b. (a -> b) -> a -> b
$ Int -> Get BitString Identity Word32
forall a. Bits a => Int -> BitGet a
BitGet.bits Int
24