content: module Rattletrap.Type.U64 where
  
  import qualified Data.Text as Text
  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
  import qualified Text.Read as Read
  
  newtype U64
    = U64 Word.Word64
    deriving (Eq, Show)
  
  instance Json.FromJSON U64 where
    parseJSON =
      Json.withText "U64" $
        either fail (pure . fromWord64)
          . Read.readEither
          . Text.unpack
  
  instance Json.ToJSON U64 where
    toJSON = Json.toJSON . show . toWord64
  
  schema :: Schema.Schema
  schema =
    Schema.named "u64" $
      Json.object [Json.pair "type" "string", Json.pair "pattern" "^[0-9]+$"]
  
  fromWord64 :: Word.Word64 -> U64
  fromWord64 = U64
  
  toWord64 :: U64 -> Word.Word64
  toWord64 (U64 x) = x
  
  bytePut :: U64 -> BytePut.BytePut
  bytePut = BytePut.word64 . toWord64
  
  bitPut :: U64 -> BitPut.BitPut
  bitPut = BitPut.fromBytePut . bytePut
  
  byteGet :: ByteGet.ByteGet U64
  byteGet = ByteGet.label "U64" $ fmap fromWord64 ByteGet.word64
  
  bitGet :: BitGet.BitGet U64
  bitGet = BitGet.fromByteGet byteGet 8
  