module Rattletrap.Type.Attribute.Boolean where

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 Boolean = Boolean
  { Boolean -> Bool
value :: Bool
  } deriving (Boolean -> Boolean -> Bool
(Boolean -> Boolean -> Bool)
-> (Boolean -> Boolean -> Bool) -> Eq Boolean
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Boolean -> Boolean -> Bool
$c/= :: Boolean -> Boolean -> Bool
== :: Boolean -> Boolean -> Bool
$c== :: Boolean -> Boolean -> Bool
Eq, Int -> Boolean -> ShowS
[Boolean] -> ShowS
Boolean -> String
(Int -> Boolean -> ShowS)
-> (Boolean -> String) -> ([Boolean] -> ShowS) -> Show Boolean
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Boolean] -> ShowS
$cshowList :: [Boolean] -> ShowS
show :: Boolean -> String
$cshow :: Boolean -> String
showsPrec :: Int -> Boolean -> ShowS
$cshowsPrec :: Int -> Boolean -> ShowS
Show)

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

instance Json.ToJSON Boolean where
  toJSON :: Boolean -> Value
toJSON = Bool -> Value
forall a. ToJSON a => a -> Value
Json.toJSON (Bool -> Value) -> (Boolean -> Bool) -> Boolean -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Boolean -> Bool
value

schema :: Schema.Schema
schema :: Schema
schema = String -> Value -> Schema
Schema.named String
"attribute-boolean" (Value -> Schema) -> Value -> Schema
forall a b. (a -> b) -> a -> b
$ Schema -> Value
Schema.ref Schema
Schema.boolean

bitPut :: Boolean -> BitPut.BitPut
bitPut :: Boolean -> BitPut
bitPut Boolean
booleanAttribute = Bool -> BitPut
BitPut.bool (Boolean -> Bool
value Boolean
booleanAttribute)

bitGet :: BitGet.BitGet Boolean
bitGet :: BitGet Boolean
bitGet = String -> BitGet Boolean -> BitGet Boolean
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"Boolean" (BitGet Boolean -> BitGet Boolean)
-> BitGet Boolean -> BitGet Boolean
forall a b. (a -> b) -> a -> b
$ do
  Bool
value <- String -> BitGet Bool -> BitGet Bool
forall a. String -> BitGet a -> BitGet a
BitGet.label String
"value" BitGet Bool
BitGet.bool
  Boolean -> BitGet Boolean
forall (f :: * -> *) a. Applicative f => a -> f a
pure Boolean :: Bool -> Boolean
Boolean { Bool
value :: Bool
value :: Bool
value }