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