module Yamlet.Value
(
Value (..)
, FloatValue (..)
, floatValueToRealFloat
, realFloatToFloatValue
, describe
, valueTag
, nullTag
, boolTag
, intTag
, floatTag
, strTag
, seqTag
, mapTag
) where
import Control.DeepSeq
import Data.Scientific qualified as Sci
import Data.Text qualified as T
import GHC.Generics
import Yamlet.Internal.Utils
data Value
= Null
| Bool !Bool
| Int !Integer
| Float !FloatValue
| String !T.Text
| Sequence ![Value]
|
Mapping ![(Value, Value)]
|
Tagged !T.Text !Value
deriving stock (Value -> Value -> Bool
(Value -> Value -> Bool) -> (Value -> Value -> Bool) -> Eq Value
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
/= :: Value -> Value -> Bool
Eq, Eq Value
Eq Value =>
(Value -> Value -> Ordering)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Bool)
-> (Value -> Value -> Value)
-> (Value -> Value -> Value)
-> Ord Value
Value -> Value -> Bool
Value -> Value -> Ordering
Value -> Value -> Value
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
$ccompare :: Value -> Value -> Ordering
compare :: Value -> Value -> Ordering
$c< :: Value -> Value -> Bool
< :: Value -> Value -> Bool
$c<= :: Value -> Value -> Bool
<= :: Value -> Value -> Bool
$c> :: Value -> Value -> Bool
> :: Value -> Value -> Bool
$c>= :: Value -> Value -> Bool
>= :: Value -> Value -> Bool
$cmax :: Value -> Value -> Value
max :: Value -> Value -> Value
$cmin :: Value -> Value -> Value
min :: Value -> Value -> Value
Ord, Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
(Int -> Value -> ShowS)
-> (Value -> String) -> ([Value] -> ShowS) -> Show Value
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Value -> ShowS
showsPrec :: Int -> Value -> ShowS
$cshow :: Value -> String
show :: Value -> String
$cshowList :: [Value] -> ShowS
showList :: [Value] -> ShowS
Show, (forall x. Value -> Rep Value x)
-> (forall x. Rep Value x -> Value) -> Generic Value
forall x. Rep Value x -> Value
forall x. Value -> Rep Value x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Value -> Rep Value x
from :: forall x. Value -> Rep Value x
$cto :: forall x. Rep Value x -> Value
to :: forall x. Rep Value x -> Value
Generic)
instance NFData Value where
rnf :: Value -> ()
rnf = \case
Value
Null -> ()
Bool Bool
_ -> ()
Int Integer
_ -> ()
Float FloatValue
_ -> ()
String Text
_ -> ()
Sequence [Value]
xs -> [Value] -> ()
forall a. NFData a => a -> ()
rnf [Value]
xs
Mapping [(Value, Value)]
kvs -> [(Value, Value)] -> ()
forall a. NFData a => a -> ()
rnf [(Value, Value)]
kvs
Tagged Text
_ Value
v -> Value -> ()
forall a. NFData a => a -> ()
rnf Value
v
data FloatValue
=
Finite !Sci.Scientific
|
NegativeZero
| Infinity
| NegativeInfinity
| NaN
deriving stock (FloatValue -> FloatValue -> Bool
(FloatValue -> FloatValue -> Bool)
-> (FloatValue -> FloatValue -> Bool) -> Eq FloatValue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FloatValue -> FloatValue -> Bool
== :: FloatValue -> FloatValue -> Bool
$c/= :: FloatValue -> FloatValue -> Bool
/= :: FloatValue -> FloatValue -> Bool
Eq, Eq FloatValue
Eq FloatValue =>
(FloatValue -> FloatValue -> Ordering)
-> (FloatValue -> FloatValue -> Bool)
-> (FloatValue -> FloatValue -> Bool)
-> (FloatValue -> FloatValue -> Bool)
-> (FloatValue -> FloatValue -> Bool)
-> (FloatValue -> FloatValue -> FloatValue)
-> (FloatValue -> FloatValue -> FloatValue)
-> Ord FloatValue
FloatValue -> FloatValue -> Bool
FloatValue -> FloatValue -> Ordering
FloatValue -> FloatValue -> FloatValue
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
$ccompare :: FloatValue -> FloatValue -> Ordering
compare :: FloatValue -> FloatValue -> Ordering
$c< :: FloatValue -> FloatValue -> Bool
< :: FloatValue -> FloatValue -> Bool
$c<= :: FloatValue -> FloatValue -> Bool
<= :: FloatValue -> FloatValue -> Bool
$c> :: FloatValue -> FloatValue -> Bool
> :: FloatValue -> FloatValue -> Bool
$c>= :: FloatValue -> FloatValue -> Bool
>= :: FloatValue -> FloatValue -> Bool
$cmax :: FloatValue -> FloatValue -> FloatValue
max :: FloatValue -> FloatValue -> FloatValue
$cmin :: FloatValue -> FloatValue -> FloatValue
min :: FloatValue -> FloatValue -> FloatValue
Ord, Int -> FloatValue -> ShowS
[FloatValue] -> ShowS
FloatValue -> String
(Int -> FloatValue -> ShowS)
-> (FloatValue -> String)
-> ([FloatValue] -> ShowS)
-> Show FloatValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FloatValue -> ShowS
showsPrec :: Int -> FloatValue -> ShowS
$cshow :: FloatValue -> String
show :: FloatValue -> String
$cshowList :: [FloatValue] -> ShowS
showList :: [FloatValue] -> ShowS
Show, (forall x. FloatValue -> Rep FloatValue x)
-> (forall x. Rep FloatValue x -> FloatValue) -> Generic FloatValue
forall x. Rep FloatValue x -> FloatValue
forall x. FloatValue -> Rep FloatValue x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FloatValue -> Rep FloatValue x
from :: forall x. FloatValue -> Rep FloatValue x
$cto :: forall x. Rep FloatValue x -> FloatValue
to :: forall x. Rep FloatValue x -> FloatValue
Generic)
instance NFData FloatValue where
rnf :: FloatValue -> ()
rnf = FloatValue -> ()
forall a. a -> ()
rwhnf
floatValueToRealFloat :: RealFloat a => FloatValue -> a
floatValueToRealFloat :: forall a. RealFloat a => FloatValue -> a
floatValueToRealFloat = \case
Finite Scientific
s -> Scientific -> a
forall a. RealFloat a => Scientific -> a
Sci.toRealFloat Scientific
s
FloatValue
NegativeZero -> -a
0
FloatValue
Infinity -> a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
0
FloatValue
NegativeInfinity -> -(a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
0)
FloatValue
NaN -> a
0 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
0
{-# INLINEABLE floatValueToRealFloat #-}
{-# SPECIALIZE floatValueToRealFloat :: FloatValue -> Double #-}
{-# SPECIALIZE floatValueToRealFloat :: FloatValue -> Float #-}
realFloatToFloatValue :: RealFloat a => a -> FloatValue
realFloatToFloatValue :: forall a. RealFloat a => a -> FloatValue
realFloatToFloatValue a
d
| a -> Bool
forall a. RealFloat a => a -> Bool
isNaN a
d = FloatValue
NaN
| a -> Bool
forall a. RealFloat a => a -> Bool
isInfinite a
d = if a
d a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
0 then FloatValue
Infinity else FloatValue
NegativeInfinity
| a -> Bool
forall a. RealFloat a => a -> Bool
isNegativeZero a
d = FloatValue
NegativeZero
| Bool
otherwise = Scientific -> FloatValue
Finite (a -> Scientific
forall a. RealFloat a => a -> Scientific
Sci.fromFloatDigits a
d)
{-# INLINEABLE realFloatToFloatValue #-}
{-# SPECIALIZE realFloatToFloatValue :: Double -> FloatValue #-}
{-# SPECIALIZE realFloatToFloatValue :: Float -> FloatValue #-}
describe :: Value -> String
describe :: Value -> String
describe = \case
Value
Null -> String
"null"
Bool Bool
_ -> String
"a boolean"
Int Integer
_ -> String
"an integer"
Float FloatValue
_ -> String
"a floating-point number"
String Text
_ -> String
"a string"
Sequence [Value]
_ -> String
"a list"
Mapping [(Value, Value)]
_ -> String
"a mapping"
Tagged Text
_ Value
v -> Value -> String
describe Value
v
valueTag :: Value -> T.Text
valueTag :: Value -> Text
valueTag = \case
Value
Null -> Text
nullTag
Bool Bool
_ -> Text
boolTag
Int Integer
_ -> Text
intTag
Float FloatValue
_ -> Text
floatTag
String Text
_ -> Text
strTag
Sequence [Value]
_ -> Text
seqTag
Mapping [(Value, Value)]
_ -> Text
mapTag
Tagged Text
tag Value
_ -> Text
tag
nullTag :: T.Text
nullTag :: Text
nullTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"null"
boolTag :: T.Text
boolTag :: Text
boolTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"bool"
intTag :: T.Text
intTag :: Text
intTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"int"
floatTag :: T.Text
floatTag :: Text
floatTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"float"
strTag :: T.Text
strTag :: Text
strTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"str"
seqTag :: T.Text
seqTag :: Text
seqTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"seq"
mapTag :: T.Text
mapTag :: Text
mapTag = Text
coreTagPrefix Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"map"