module Rattletrap.Type.U32 where

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

newtype U32
  = U32 Word.Word32
  deriving (U32 -> U32 -> Bool
(U32 -> U32 -> Bool) -> (U32 -> U32 -> Bool) -> Eq U32
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: U32 -> U32 -> Bool
$c/= :: U32 -> U32 -> Bool
== :: U32 -> U32 -> Bool
$c== :: U32 -> U32 -> Bool
Eq, Eq U32
Eq U32
-> (U32 -> U32 -> Ordering)
-> (U32 -> U32 -> Bool)
-> (U32 -> U32 -> Bool)
-> (U32 -> U32 -> Bool)
-> (U32 -> U32 -> Bool)
-> (U32 -> U32 -> U32)
-> (U32 -> U32 -> U32)
-> Ord U32
U32 -> U32 -> Bool
U32 -> U32 -> Ordering
U32 -> U32 -> U32
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: U32 -> U32 -> U32
$cmin :: U32 -> U32 -> U32
max :: U32 -> U32 -> U32
$cmax :: U32 -> U32 -> U32
>= :: U32 -> U32 -> Bool
$c>= :: U32 -> U32 -> Bool
> :: U32 -> U32 -> Bool
$c> :: U32 -> U32 -> Bool
<= :: U32 -> U32 -> Bool
$c<= :: U32 -> U32 -> Bool
< :: U32 -> U32 -> Bool
$c< :: U32 -> U32 -> Bool
compare :: U32 -> U32 -> Ordering
$ccompare :: U32 -> U32 -> Ordering
$cp1Ord :: Eq U32
Ord, Int -> U32 -> ShowS
[U32] -> ShowS
U32 -> String
(Int -> U32 -> ShowS)
-> (U32 -> String) -> ([U32] -> ShowS) -> Show U32
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [U32] -> ShowS
$cshowList :: [U32] -> ShowS
show :: U32 -> String
$cshow :: U32 -> String
showsPrec :: Int -> U32 -> ShowS
$cshowsPrec :: Int -> U32 -> ShowS
Show)

instance Json.FromJSON U32 where
  parseJSON :: Value -> Parser U32
parseJSON = (Word32 -> U32) -> Parser Word32 -> Parser U32
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Word32 -> U32
fromWord32 (Parser Word32 -> Parser U32)
-> (Value -> Parser Word32) -> Value -> Parser U32
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 U32 where
  toJSON :: U32 -> Value
toJSON = Word32 -> Value
forall a. ToJSON a => a -> Value
Json.toJSON (Word32 -> Value) -> (U32 -> Word32) -> U32 -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. U32 -> Word32
toWord32

schema :: Schema.Schema
schema :: Schema
schema = String -> Value -> Schema
Schema.named String
"u32" (Value -> Schema) -> Value -> Schema
forall a b. (a -> b) -> a -> b
$ [Pair] -> Value
Json.object
  [ String -> String -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"type" String
"integer"
  , String -> Word32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"minimum" (Word32
forall a. Bounded a => a
minBound :: Word.Word32)
  , String -> Word32 -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"maximum" (Word32
forall a. Bounded a => a
maxBound :: Word.Word32)
  ]

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

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

bytePut :: U32 -> BytePut.BytePut
bytePut :: U32 -> BytePut
bytePut = Word32 -> BytePut
BytePut.word32 (Word32 -> BytePut) -> (U32 -> Word32) -> U32 -> BytePut
forall b c a. (b -> c) -> (a -> b) -> a -> c
. U32 -> Word32
toWord32

bitPut :: U32 -> BitPut.BitPut
bitPut :: U32 -> BitPut
bitPut = BytePut -> BitPut
BitPut.fromBytePut (BytePut -> BitPut) -> (U32 -> BytePut) -> U32 -> BitPut
forall b c a. (b -> c) -> (a -> b) -> a -> c
. U32 -> BytePut
bytePut

byteGet :: ByteGet.ByteGet U32
byteGet :: ByteGet U32
byteGet = String -> ByteGet U32 -> ByteGet U32
forall a. String -> ByteGet a -> ByteGet a
ByteGet.label String
"U32" (ByteGet U32 -> ByteGet U32) -> ByteGet U32 -> ByteGet U32
forall a b. (a -> b) -> a -> b
$ (Word32 -> U32) -> Get ByteString Identity Word32 -> ByteGet U32
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Word32 -> U32
fromWord32 Get ByteString Identity Word32
ByteGet.word32

bitGet :: BitGet.BitGet U32
bitGet :: BitGet U32
bitGet = ByteGet U32 -> Int -> BitGet U32
forall a. ByteGet a -> Int -> BitGet a
BitGet.fromByteGet ByteGet U32
byteGet Int
4