module Rattletrap.Type.Attribute.Float where

import qualified Rattletrap.BitGet as BitGet
import qualified Rattletrap.BitPut as BitPut
import qualified Rattletrap.Schema as Schema
import qualified Rattletrap.Type.F32 as F32
import qualified Rattletrap.Utility.Json as Json
import Prelude hiding (Float)

newtype Float = Float
  { Float -> F32
value :: F32.F32
  }
  deriving (Float -> Float -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Float -> Float -> Bool
$c/= :: Float -> Float -> Bool
== :: Float -> Float -> Bool
$c== :: Float -> Float -> Bool
Eq, Int -> Float -> ShowS
[Float] -> ShowS
Float -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Float] -> ShowS
$cshowList :: [Float] -> ShowS
show :: Float -> String
$cshow :: Float -> String
showsPrec :: Int -> Float -> ShowS
$cshowsPrec :: Int -> Float -> ShowS
Show)

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

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

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

bitPut :: Float -> BitPut.BitPut
bitPut :: Float -> BitPut
bitPut Float
floatAttribute = F32 -> BitPut
F32.bitPut (Float -> F32
value Float
floatAttribute)

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