{-# OPTIONS_HADDOCK not-home #-}
module Yamlet.Internal.FromYaml
(
FromYaml (..)
, Parser
, runParser
, runParserWithin
, parseNode
, failAt
, typeMismatch
, orElse
, withNull
, withBool
, withInt
, withFloat
, withScientific
, withText
, withName
, oneOf
, withSequence
, withMapping
, Object (..)
, objectNode
, objectEntries
, objectKeys
, lookupKey
, parseField
, parseFieldMaybe
, parseFieldIfPresent
, parseFieldDefault
, parseFieldWith
, parseFieldMaybeWith
, parseFieldIfPresentWith
, parseFieldDefaultWith
, rejectUnknownKeys
, parseItems
, parseEntry
, findKey
, missingKey
, unknownName
, unquotedName
, succeeds
, withNote
, nullNode
) where
import Control.Applicative
import Control.Monad
import Data.Containers.ListUtils
import Data.Fixed
import Data.Functor.Identity
import Data.Int
import Data.IntMap.Strict qualified as IM
import Data.IntSet qualified as IS
import Data.List qualified as L
import Data.List.NonEmpty qualified as NE
import Data.Map.Strict qualified as M
import Data.Maybe
import Data.Monoid qualified as Mon
import Data.Ord
import Data.Proxy
import Data.Scientific qualified as Sci
import Data.Semigroup qualified as Sem
import Data.Sequence qualified as Seq
import Data.Set qualified as Set
import Data.Text qualified as T
import Data.Text.Lazy qualified as TL
import Data.Time
import Data.Time.Calendar.Month
import Data.Time.Calendar.Quarter
import Data.Time.FromText
import Data.Tree qualified as Tree
import Data.UUID.Types qualified as UUID
import Data.Void
import Data.Word
import GHC.Real
import Numeric.Natural
import Yamlet.Internal.Compose
import Yamlet.Internal.Schema
import Yamlet.Internal.Syntax qualified as S
import Yamlet.Internal.Utils
import Yamlet.Internal.View
import Yamlet.Value
newtype Parser a = Parser (S.Offset -> Result a)
data Result a = Result !Errors a
data Errors
= NoErrors
|
OneError !S.Offset !String ![(S.Offset, String)]
| BothErrors !Errors !Errors
bothErrors :: Errors -> Errors -> Errors
bothErrors :: Errors -> Errors -> Errors
bothErrors Errors
e1 Errors
e2 = case (Errors
e1, Errors
e2) of
(Errors
NoErrors, Errors
_) -> Errors
e2
(Errors
_, Errors
NoErrors) -> Errors
e1
(Errors, Errors)
_ -> Errors -> Errors -> Errors
BothErrors Errors
e1 Errors
e2
{-# NOINLINE bothErrors #-}
failed :: a
failed :: forall a. a
failed = [Char] -> a
forall a. [Char] -> a
errorWithoutStackTrace [Char]
"Yamlet.Decode: the value of a failed parser"
failure :: S.Offset -> String -> Result a
failure :: forall a. Offset -> [Char] -> Result a
failure Offset
off [Char]
msg = Errors -> a -> Result a
forall a. Errors -> a -> Result a
Result (Offset -> [Char] -> [(Offset, [Char])] -> Errors
OneError Offset
off [Char]
msg []) a
forall a. a
failed
instance Functor Parser where
fmap :: forall a b. (a -> b) -> Parser a -> Parser b
fmap a -> b
f (Parser Offset -> Result a
g) = (Offset -> Result b) -> Parser b
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result b) -> Parser b)
-> (Offset -> Result b) -> Parser b
forall a b. (a -> b) -> a -> b
$ \Offset
off -> case Offset -> Result a
g Offset
off of
Result Errors
e a
a -> Errors -> b -> Result b
forall a. Errors -> a -> Result a
Result Errors
e (a -> b
f a
a)
instance Applicative Parser where
pure :: forall a. a -> Parser a
pure a
a = (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
_ -> Errors -> a -> Result a
forall a. Errors -> a -> Result a
Result Errors
NoErrors a
a
Parser Offset -> Result (a -> b)
f <*> :: forall a b. Parser (a -> b) -> Parser a -> Parser b
<*> Parser Offset -> Result a
g = (Offset -> Result b) -> Parser b
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result b) -> Parser b)
-> (Offset -> Result b) -> Parser b
forall a b. (a -> b) -> a -> b
$ \Offset
off -> case Offset -> Result (a -> b)
f Offset
off of
Result Errors
e1 a -> b
h -> case Offset -> Result a
g Offset
off of
Result Errors
e2 a
a -> Errors -> b -> Result b
forall a. Errors -> a -> Result a
Result (Errors -> Errors -> Errors
bothErrors Errors
e1 Errors
e2) (a -> b
h a
a)
instance Monad Parser where
Parser Offset -> Result a
g >>= :: forall a b. Parser a -> (a -> Parser b) -> Parser b
>>= a -> Parser b
k = (Offset -> Result b) -> Parser b
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result b) -> Parser b)
-> (Offset -> Result b) -> Parser b
forall a b. (a -> b) -> a -> b
$ \Offset
off -> case Offset -> Result a
g Offset
off of
Result Errors
NoErrors a
a -> let Parser Offset -> Result b
h = a -> Parser b
k a
a in Offset -> Result b
h Offset
off
Result Errors
e a
_ -> Errors -> b -> Result b
forall a. Errors -> a -> Result a
Result Errors
e b
forall a. a
failed
instance MonadFail Parser where
fail :: forall a. [Char] -> Parser a
fail [Char]
msg = (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
off -> Offset -> [Char] -> Result a
forall a. Offset -> [Char] -> Result a
failure Offset
off [Char]
msg
runParser :: (S.Node -> Parser a) -> S.Node -> Either (NE.NonEmpty (S.Offset, String)) a
runParser :: forall a.
(Node -> Parser a) -> Node -> Either (NonEmpty (Offset, [Char])) a
runParser Node -> Parser a
f Node
n0 = Either (NonEmpty (Offset, [Char])) (a, Int)
-> Either (NonEmpty (Offset, [Char])) a
forall e a b. Either e (a, b) -> Either e a
firstOfResult (Either (NonEmpty (Offset, [Char])) (a, Int)
-> Either (NonEmpty (Offset, [Char])) a)
-> Either (NonEmpty (Offset, [Char])) (a, Int)
-> Either (NonEmpty (Offset, [Char])) a
forall a b. (a -> b) -> a -> b
$ Int
-> Int
-> (Node -> Parser a)
-> Node
-> Either (NonEmpty (Offset, [Char])) (a, Int)
forall a.
Int
-> Int
-> (Node -> Parser a)
-> Node
-> Either (NonEmpty (Offset, [Char])) (a, Int)
runParserWithin ([Node] -> Int
aliasLimit [Node
n0]) Int
0 Node -> Parser a
f Node
n0
runParserWithin
:: Int
-> Int
-> (S.Node -> Parser a)
-> S.Node
-> Either (NE.NonEmpty (S.Offset, String)) (a, Int)
runParserWithin :: forall a.
Int
-> Int
-> (Node -> Parser a)
-> Node
-> Either (NonEmpty (Offset, [Char])) (a, Int)
runParserWithin Int
limit Int
added Node -> Parser a
f Node
n0 = case Int
-> Int -> Node -> Either (NonEmpty (Offset, [Char])) (Node, Int)
prepareWithin Int
limit Int
added Node
n0 of
Left NonEmpty (Offset, [Char])
err -> NonEmpty (Offset, [Char])
-> Either (NonEmpty (Offset, [Char])) (a, Int)
forall a b. a -> Either a b
Left NonEmpty (Offset, [Char])
err
Right (Node
n, Int
added') -> case (Node -> Parser a) -> Node -> Result a
forall a. (Node -> Parser a) -> Node -> Result a
runChecked Node -> Parser a
f Node
n of
Result Errors
NoErrors a
a -> (a, Int) -> Either (NonEmpty (Offset, [Char])) (a, Int)
forall a b. b -> Either a b
Right (a
a, Int
added')
Result Errors
e a
_ -> NonEmpty (Offset, [Char])
-> Either (NonEmpty (Offset, [Char])) (a, Int)
forall a b. a -> Either a b
Left ([(Offset, [Char])] -> NonEmpty (Offset, [Char])
forall a. HasCallStack => [a] -> NonEmpty a
NE.fromList (Errors -> [(Offset, [Char])]
sortedErrors Errors
e))
where
sortedErrors :: Errors -> [(S.Offset, String)]
sortedErrors :: Errors -> [(Offset, [Char])]
sortedErrors =
((Offset, [Char], [(Offset, [Char])]) -> [(Offset, [Char])])
-> [(Offset, [Char], [(Offset, [Char])])] -> [(Offset, [Char])]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(Offset
off, [Char]
msg, [(Offset, [Char])]
notes) -> (Offset
off, [Char]
msg) (Offset, [Char]) -> [(Offset, [Char])] -> [(Offset, [Char])]
forall a. a -> [a] -> [a]
: [(Offset, [Char])]
notes)
([(Offset, [Char], [(Offset, [Char])])] -> [(Offset, [Char])])
-> (Errors -> [(Offset, [Char], [(Offset, [Char])])])
-> Errors
-> [(Offset, [Char])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
forall a. Ord a => [a] -> [a]
nubOrd
([(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])])
-> (Errors -> [(Offset, [Char], [(Offset, [Char])])])
-> Errors
-> [(Offset, [Char], [(Offset, [Char])])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Offset, [Char], [(Offset, [Char])]) -> Offset)
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
forall b a. Ord b => (a -> b) -> [a] -> [a]
L.sortOn (\(Offset
off, [Char]
_, [(Offset, [Char])]
_) -> Offset
off)
([(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])])
-> (Errors -> [(Offset, [Char], [(Offset, [Char])])])
-> Errors
-> [(Offset, [Char], [(Offset, [Char])])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Errors
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])])
-> [(Offset, [Char], [(Offset, [Char])])]
-> Errors
-> [(Offset, [Char], [(Offset, [Char])])]
forall a b c. (a -> b -> c) -> b -> a -> c
flip Errors
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
go []
where
go
:: Errors
-> [(S.Offset, String, [(S.Offset, String)])]
-> [(S.Offset, String, [(S.Offset, String)])]
go :: Errors
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
go = \case
Errors
NoErrors -> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
forall a. a -> a
id
OneError Offset
off [Char]
msg [(Offset, [Char])]
notes -> ((Offset
off, [Char]
msg, [(Offset, [Char])]
notes) (Offset, [Char], [(Offset, [Char])])
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
forall a. a -> [a] -> [a]
:)
BothErrors Errors
e1 Errors
e2 -> Errors
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
go Errors
e1 ([(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])])
-> ([(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])])
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Errors
-> [(Offset, [Char], [(Offset, [Char])])]
-> [(Offset, [Char], [(Offset, [Char])])]
go Errors
e2
runChecked :: (S.Node -> Parser a) -> S.Node -> Result a
runChecked :: forall a. (Node -> Parser a) -> Node -> Result a
runChecked Node -> Parser a
f Node
n = let Parser Offset -> Result a
g = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
f Node
n in Offset -> Result a
g Node
n.offset
succeeds :: (S.Node -> Parser a) -> S.Node -> Maybe a
succeeds :: forall a. (Node -> Parser a) -> Node -> Maybe a
succeeds Node -> Parser a
f Node
n = case (Node -> Parser a) -> Node -> Result a
forall a. (Node -> Parser a) -> Node -> Result a
runChecked Node -> Parser a
f Node
n of
Result Errors
NoErrors a
a -> a -> Maybe a
forall a. a -> Maybe a
Just a
a
Result Errors
_ a
_ -> Maybe a
forall a. Maybe a
Nothing
withNote :: S.Offset -> (S.Offset, String) -> Parser a -> Parser a
withNote :: forall a. Offset -> (Offset, [Char]) -> Parser a -> Parser a
withNote Offset
off (Offset, [Char])
note (Parser Offset -> Result a
g) = (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
o -> case Offset -> Result a
g Offset
o of
r :: Result a
r@(Result Errors
NoErrors a
_) -> Result a
r
Result Errors
e a
a -> Errors -> a -> Result a
forall a. Errors -> a -> Result a
Result (Errors -> Errors
addNote Errors
e) a
a
where
addNote :: Errors -> Errors
addNote :: Errors -> Errors
addNote = \case
OneError Offset
eo [Char]
msg [(Offset, [Char])]
notes | Offset
eo Offset -> Offset -> Bool
forall a. Eq a => a -> a -> Bool
== Offset
off -> Offset -> [Char] -> [(Offset, [Char])] -> Errors
OneError Offset
eo [Char]
msg ([(Offset, [Char])]
notes [(Offset, [Char])] -> [(Offset, [Char])] -> [(Offset, [Char])]
forall a. [a] -> [a] -> [a]
++ [(Offset, [Char])
note])
BothErrors Errors
e1 Errors
e2 -> Errors -> Errors -> Errors
BothErrors (Errors -> Errors
addNote Errors
e1) (Errors -> Errors
addNote Errors
e2)
Errors
e -> Errors
e
parseNode :: (S.Node -> Parser a) -> S.Node -> Parser a
parseNode :: forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
f Node
n = let Parser Offset -> Result a
g = Node -> Parser a
f Node
n in (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
_ -> Offset -> Result a
g Node
n.offset
failAt :: S.Node -> String -> Parser a
failAt :: forall a. Node -> [Char] -> Parser a
failAt Node
n [Char]
msg = (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
_ -> Offset -> [Char] -> Result a
forall a. Offset -> [Char] -> Result a
failure Node
n.offset [Char]
msg
typeMismatch :: String -> S.Node -> Parser a
typeMismatch :: forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
expected Node
n = Node -> [Char] -> Parser a
forall a. Node -> [Char] -> Parser a
failAt Node
n ([Char] -> Node -> [Char]
mismatchMessage [Char]
expected Node
n)
mismatchMessage :: String -> S.Node -> String
mismatchMessage :: [Char] -> Node -> [Char]
mismatchMessage [Char]
expected Node
n = [Char]
"expected " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
expected [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", but got " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Node -> [Char]
describeNode Node
n
nullNode :: S.Node
nullNode :: Node
nullNode =
Offset -> Offset -> Props -> Comments -> Content -> Node
S.Node Offset
S.noOffset Offset
S.noOffset Props
S.noProps Comments
S.noComments (ScalarStyle -> Text -> Content
S.ScalarContent ScalarStyle
S.Plain Text
"")
orElse :: Parser a -> Parser a -> Parser a
orElse :: forall a. Parser a -> Parser a -> Parser a
orElse (Parser Offset -> Result a
g) (Parser Offset -> Result a
h) = (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
off -> case Offset -> Result a
g Offset
off of
r :: Result a
r@(Result Errors
NoErrors a
_) -> Result a
r
Result a
_ -> Offset -> Result a
h Offset
off
infixl 3 `orElse`
withNull :: Parser a -> S.Node -> Parser a
withNull :: forall a. Parser a -> Node -> Parser a
withNull Parser a
p = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
View
NullView -> Parser a
p
View
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"null" Node
n
withBool :: (Bool -> Parser a) -> S.Node -> Parser a
withBool :: forall a. (Bool -> Parser a) -> Node -> Parser a
withBool Bool -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
BoolView Bool
b -> Bool -> Parser a
f Bool
b
StringView Text
t
| S.ScalarContent ScalarStyle
S.Plain Text
_ <- Node
n.content
, Tag
S.NoTag <- Node
n.props.tag
, Text -> Bool
isYaml11Bool Text
t ->
Node -> [Char] -> Parser a
forall a. Node -> [Char] -> Parser a
failAt Node
n ([Char] -> Parser a) -> [Char] -> Parser a
forall a b. (a -> b) -> a -> b
$
[Char]
"expected a boolean, but got the string "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
t
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", which is a boolean only in YAML 1.1, use true or false"
View
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a boolean" Node
n
withInt :: (Integer -> Parser a) -> S.Node -> Parser a
withInt :: forall a. (Integer -> Parser a) -> Node -> Parser a
withInt Integer -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
IntView Integer
i -> Integer -> Parser a
f Integer
i
View
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"an integer" Node
n
withFloat :: (Double -> Parser a) -> S.Node -> Parser a
withFloat :: forall a. (Double -> Parser a) -> Node -> Parser a
withFloat = (Double -> Parser a) -> Node -> Parser a
forall b a. RealFloat b => (b -> Parser a) -> Node -> Parser a
withRealFloat
withRealFloat :: RealFloat b => (b -> Parser a) -> S.Node -> Parser a
withRealFloat :: forall b a. RealFloat b => (b -> Parser a) -> Node -> Parser a
withRealFloat b -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
FloatView FloatValue
v -> b -> Parser a
f (FloatValue -> b
forall a. RealFloat a => FloatValue -> a
floatValueToRealFloat FloatValue
v)
IntView Integer
i -> b -> Parser a
f (Integer -> b
forall a. Num a => Integer -> a
fromInteger Integer
i)
View
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a number" Node
n
withScientific :: (Sci.Scientific -> Parser a) -> S.Node -> Parser a
withScientific :: forall a. (Scientific -> Parser a) -> Node -> Parser a
withScientific Scientific -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
FloatView (Finite Scientific
s) -> Scientific -> Parser a
f Scientific
s
FloatView FloatValue
NegativeZero -> Scientific -> Parser a
f Scientific
0
IntView Integer
i -> Scientific -> Parser a
f (Integer -> Int -> Scientific
Sci.scientific Integer
i Int
0)
FloatView FloatValue
_ -> [Char] -> Parser a
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a finite number"
View
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a number" Node
n
withText :: (T.Text -> Parser a) -> S.Node -> Parser a
withText :: forall a. (Text -> Parser a) -> Node -> Parser a
withText Text -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
StringView Text
t -> Text -> Parser a
f (Text -> Parser a) -> Text -> Parser a
forall a b. (a -> b) -> a -> b
$! Text -> Text
T.copy Text
t
View
_ -> Node -> [Char] -> Parser a
forall a. Node -> [Char] -> Parser a
failAt Node
n (Node -> [Char]
stringMismatch Node
n)
withName :: [T.Text] -> (T.Text -> Parser a) -> S.Node -> Parser a
withName :: forall a. [Text] -> (Text -> Parser a) -> Node -> Parser a
withName [Text]
names Text -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
StringView Text
t -> Text -> Parser a
f Text
t
View
_ | Just [Char]
msg <- [Text] -> Node -> Maybe [Char]
unquotedName [Text]
names Node
n -> Node -> [Char] -> Parser a
forall a. Node -> [Char] -> Parser a
failAt Node
n [Char]
msg
View
_ | [Text] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Text]
names -> Node -> [Char] -> Parser a
forall a. Node -> [Char] -> Parser a
failAt Node
n [Char]
"no value is accepted"
View
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch ([Char]
"one of: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
L.intercalate [Char]
", " ((Text -> [Char]) -> [Text] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map Text -> [Char]
T.unpack [Text]
names)) Node
n
unquotedName :: [T.Text] -> S.Node -> Maybe String
unquotedName :: [Text] -> Node -> Maybe [Char]
unquotedName [Text]
names Node
n = case Node
n.content of
S.ScalarContent ScalarStyle
S.Plain Text
t
| Tag
S.NoTag <- Node
n.props.tag
, Text
t Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text]
names ->
[Char] -> Maybe [Char]
forall a. a -> Maybe a
Just (Node -> [Char]
stringMismatch Node
n)
Content
_ -> Maybe [Char]
forall a. Maybe a
Nothing
oneOf :: [(T.Text, a)] -> S.Node -> Parser a
oneOf :: forall a. [(Text, a)] -> Node -> Parser a
oneOf [(Text, a)]
choices Node
n =
[Text] -> (Text -> Parser a) -> Node -> Parser a
forall a. [Text] -> (Text -> Parser a) -> Node -> Parser a
withName [Text]
names (\Text
t -> Parser a -> (a -> Parser a) -> Maybe a -> Parser a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> [Text] -> Node -> Text -> Parser a
forall a. [Char] -> [Text] -> Node -> Text -> Parser a
unknownName [Char]
"value" [Text]
names Node
n Text
t) a -> Parser a
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> [(Text, a)] -> Maybe a
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Text
t [(Text, a)]
choices)) Node
n
where
names :: [T.Text]
names :: [Text]
names = ((Text, a) -> Text) -> [(Text, a)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, a) -> Text
forall a b. (a, b) -> a
fst [(Text, a)]
choices
stringMismatch :: S.Node -> String
stringMismatch :: Node -> [Char]
stringMismatch Node
n = [Char] -> Node -> [Char]
mismatchMessage [Char]
"a string" Node
n [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
hint
where
hint :: String
hint :: [Char]
hint = case Node
n.content of
S.ScalarContent ScalarStyle
S.Plain Text
t
| Tag
S.NoTag <- Node
n.props.tag
, Text -> Bool
notString Text
t ->
[Char]
", quote the value, e.g. '" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
T.unpack Text
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"'"
Content
_ -> [Char]
""
notString :: T.Text -> Bool
notString :: Text -> Bool
notString Text
t = case Node -> View
view Node
n of
IntView Integer
_ -> Bool
True
FloatView FloatValue
_ -> Bool
True
BoolView Bool
_ -> Bool
True
View
NullView -> Bool -> Bool
not (Text -> Bool
T.null Text
t)
View
_ -> Bool
False
{-# NOINLINE stringMismatch #-}
withSequence :: ([S.Node] -> Parser a) -> S.Node -> Parser a
withSequence :: forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence [Node] -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node
n.content of
S.SequenceContent CollectionStyle
_ [Node]
xs -> [Node] -> Parser a
f [Node]
xs
Content
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a list" Node
n
parseItems :: forall a. (S.Node -> Parser a) -> [S.Node] -> Parser [a]
parseItems :: forall a. (Node -> Parser a) -> [Node] -> Parser [a]
parseItems Node -> Parser a
p [Node]
xs0 = (Offset -> Result [a]) -> Parser [a]
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result [a]) -> Parser [a])
-> (Offset -> Result [a]) -> Parser [a]
forall a b. (a -> b) -> a -> b
$ \Offset
off -> Offset -> Errors -> [a] -> [Node] -> Result [a]
go Offset
off Errors
NoErrors [] [Node]
xs0
where
go :: S.Offset -> Errors -> [a] -> [S.Node] -> Result [a]
go :: Offset -> Errors -> [a] -> [Node] -> Result [a]
go Offset
off !Errors
errs [a]
acc = \case
[] -> case Errors
errs of
Errors
NoErrors -> Errors -> [a] -> Result [a]
forall a. Errors -> a -> Result a
Result Errors
NoErrors ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
acc)
Errors
_ -> Errors -> [a] -> Result [a]
forall a. Errors -> a -> Result a
Result Errors
errs [a]
forall a. a
failed
Node
x : [Node]
xs ->
let Parser Offset -> Result a
g = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
p Node
x
in case Offset -> Result a
g Offset
off of
Result Errors
e a
a -> Offset -> Errors -> [a] -> [Node] -> Result [a]
go Offset
off (Errors -> Errors -> Errors
bothErrors Errors
errs Errors
e) (a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
acc) [Node]
xs
withMapping :: (Object -> Parser a) -> S.Node -> Parser a
withMapping :: forall a. (Object -> Parser a) -> Node -> Parser a
withMapping Object -> Parser a
f = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser a) -> Node -> Parser a)
-> (Node -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node
n.content of
S.MappingContent CollectionStyle
_ [(Node, Node)]
kvs -> case Node -> [(Node, Node)] -> (Errors, Object)
mkObject Node
n [(Node, Node)]
kvs of
(Errors
NoErrors, Object
o) -> Object -> Parser a
f Object
o
(Errors
errs, Object
o) ->
let Parser Offset -> Result a
g = Object -> Parser a
f Object
o
in (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
off -> case Offset -> Result a
g Offset
off of
Result Errors
e a
_ -> Errors -> a -> Result a
forall a. Errors -> a -> Result a
Result (Errors -> Errors -> Errors
bothErrors Errors
errs Errors
e) a
forall a. a
failed
Content
_ -> [Char] -> Node -> Parser a
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a mapping" Node
n
where
mkObject :: S.Node -> [(S.Node, S.Node)] -> (Errors, Object)
mkObject :: Node -> [(Node, Node)] -> (Errors, Object)
mkObject Node
n [(Node, Node)]
kvs =
case Map Text (Node, Node)
-> Errors
-> [(Node, Value)]
-> [(Node, Node)]
-> (Map Text (Node, Node), Errors, [(Node, Value)])
go Map Text (Node, Node)
forall k a. Map k a
M.empty Errors
NoErrors [] [(Node, Node)]
kvs of
(Map Text (Node, Node)
index, Errors
errs, [(Node, Value)]
others) ->
let !o :: Object
o =
Object
{ node :: Node
node = Node
n
, entries :: [(Node, Node)]
entries = [(Node, Node)]
kvs
, index :: Map Text (Node, Node)
index = Map Text (Node, Node)
index
, otherKeys :: [(Node, Value)]
otherKeys = [(Node, Value)]
others
, duplicates :: Bool
duplicates = case Errors
errs of
Errors
NoErrors -> Bool
False
Errors
_ -> Bool
True
}
in (Errors
errs, Object
o)
where
go
:: M.Map T.Text (S.Node, S.Node)
-> Errors
-> [(S.Node, Value)]
-> [(S.Node, S.Node)]
-> (M.Map T.Text (S.Node, S.Node), Errors, [(S.Node, Value)])
go :: Map Text (Node, Node)
-> Errors
-> [(Node, Value)]
-> [(Node, Node)]
-> (Map Text (Node, Node), Errors, [(Node, Value)])
go !Map Text (Node, Node)
m !Errors
errs ![(Node, Value)]
others = \case
[] -> (Map Text (Node, Node)
m, Errors
errs, [(Node, Value)] -> [(Node, Value)]
forall a. [a] -> [a]
reverse [(Node, Value)]
others)
kv :: (Node, Node)
kv@(Node
k, Node
_) : [(Node, Node)]
rest -> case Node -> Maybe Text
stringValue Node
k of
Just Text
t -> case (Text -> (Node, Node) -> (Node, Node) -> (Node, Node))
-> Text
-> (Node, Node)
-> Map Text (Node, Node)
-> (Maybe (Node, Node), Map Text (Node, Node))
forall k a.
Ord k =>
(k -> a -> a -> a) -> k -> a -> Map k a -> (Maybe a, Map k a)
M.insertLookupWithKey (\Text
_ (Node, Node)
_ (Node, Node)
old -> (Node, Node)
old) Text
t (Node, Node)
kv Map Text (Node, Node)
m of
(Just (Node
first, Node
_), Map Text (Node, Node)
_) ->
Map Text (Node, Node)
-> Errors
-> [(Node, Value)]
-> [(Node, Node)]
-> (Map Text (Node, Node), Errors, [(Node, Value)])
go
Map Text (Node, Node)
m
( Errors -> Errors -> Errors
bothErrors Errors
errs (Errors -> Errors) -> Errors -> Errors
forall a b. (a -> b) -> a -> b
$
Offset -> [Char] -> [(Offset, [Char])] -> Errors
OneError
Node
k.offset
([Char]
"duplicate key " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
t)
[(Node
first.offset, [Char]
"the first key " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
t)]
)
[(Node, Value)]
others
[(Node, Node)]
rest
(Maybe (Node, Node)
Nothing, Map Text (Node, Node)
m') -> Map Text (Node, Node)
-> Errors
-> [(Node, Value)]
-> [(Node, Node)]
-> (Map Text (Node, Node), Errors, [(Node, Value)])
go Map Text (Node, Node)
m' Errors
errs [(Node, Value)]
others [(Node, Node)]
rest
Maybe Text
Nothing -> case Node
k.content of
S.ScalarContent ScalarStyle
style Text
t ->
Map Text (Node, Node)
-> Errors
-> [(Node, Value)]
-> [(Node, Node)]
-> (Map Text (Node, Node), Errors, [(Node, Value)])
go Map Text (Node, Node)
m Errors
errs ((Node
k, Tag -> ScalarStyle -> Text -> Value
scalarValue Node
k.props.tag ScalarStyle
style Text
t) (Node, Value) -> [(Node, Value)] -> [(Node, Value)]
forall a. a -> [a] -> [a]
: [(Node, Value)]
others) [(Node, Node)]
rest
Content
_ -> Map Text (Node, Node)
-> Errors
-> [(Node, Value)]
-> [(Node, Node)]
-> (Map Text (Node, Node), Errors, [(Node, Value)])
go Map Text (Node, Node)
m Errors
errs [(Node, Value)]
others [(Node, Node)]
rest
data Object = Object
{ Object -> Node
node :: !S.Node
, Object -> [(Node, Node)]
entries :: ![(S.Node, S.Node)]
, Object -> Map Text (Node, Node)
index :: !(M.Map T.Text (S.Node, S.Node))
, Object -> [(Node, Value)]
otherKeys :: ![(S.Node, Value)]
, Object -> Bool
duplicates :: !Bool
}
objectNode :: Object -> S.Node
objectNode :: Object -> Node
objectNode Object
o = Object
o.node
objectEntries :: Object -> [(S.Node, S.Node)]
objectEntries :: Object -> [(Node, Node)]
objectEntries Object
o = Object
o.entries
objectKeys :: Object -> [T.Text]
objectKeys :: Object -> [Text]
objectKeys Object
o = [Text
c | (Node
k, Node
_) <- Object
o.entries, Just Text
t <- [Node -> Maybe Text
stringValue Node
k], let !c :: Text
c = Text -> Text
T.copy Text
t]
lookupKey :: Object -> T.Text -> Parser (Maybe S.Node)
lookupKey :: Object -> Text -> Parser (Maybe Node)
lookupKey Object
o Text
key = ((Node, Node) -> Node) -> Maybe (Node, Node) -> Maybe Node
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Node, Node) -> Node
forall a b. (a, b) -> b
snd (Maybe (Node, Node) -> Maybe Node)
-> Parser (Maybe (Node, Node)) -> Parser (Maybe Node)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object -> Text -> Parser (Maybe (Node, Node))
findKey Object
o Text
key
parseField :: FromYaml a => Object -> T.Text -> Parser a
parseField :: forall a. FromYaml a => Object -> Text -> Parser a
parseField = ((Node, Node) -> Parser a) -> Object -> Text -> Parser a
forall a. ((Node, Node) -> Parser a) -> Object -> Text -> Parser a
entryField (Node, Node) -> Parser a
forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry
parseFieldMaybe :: FromYaml a => Object -> T.Text -> Parser (Maybe a)
parseFieldMaybe :: forall a. FromYaml a => Object -> Text -> Parser (Maybe a)
parseFieldMaybe = ((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a.
((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
entryFieldMaybe (Node, Node) -> Parser a
forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry
parseFieldIfPresent :: FromYaml a => Object -> T.Text -> Parser (Maybe a)
parseFieldIfPresent :: forall a. FromYaml a => Object -> Text -> Parser (Maybe a)
parseFieldIfPresent = ((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a.
((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
entryFieldIfPresent (Node, Node) -> Parser a
forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry
parseFieldDefault :: FromYaml a => Object -> T.Text -> a -> Parser a
parseFieldDefault :: forall a. FromYaml a => Object -> Text -> a -> Parser a
parseFieldDefault Object
o Text
key a
def = a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe a
def (Maybe a -> a) -> Parser (Maybe a) -> Parser a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object -> Text -> Parser (Maybe a)
forall a. FromYaml a => Object -> Text -> Parser (Maybe a)
parseFieldMaybe Object
o Text
key
parseFieldWith :: (S.Node -> Parser a) -> Object -> T.Text -> Parser a
parseFieldWith :: forall a. (Node -> Parser a) -> Object -> Text -> Parser a
parseFieldWith Node -> Parser a
p = ((Node, Node) -> Parser a) -> Object -> Text -> Parser a
forall a. ((Node, Node) -> Parser a) -> Object -> Text -> Parser a
entryField ((Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
p (Node -> Parser a)
-> ((Node, Node) -> Node) -> (Node, Node) -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node, Node) -> Node
forall a b. (a, b) -> b
snd)
parseFieldMaybeWith :: (S.Node -> Parser a) -> Object -> T.Text -> Parser (Maybe a)
parseFieldMaybeWith :: forall a. (Node -> Parser a) -> Object -> Text -> Parser (Maybe a)
parseFieldMaybeWith Node -> Parser a
p = ((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a.
((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
entryFieldMaybe ((Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
p (Node -> Parser a)
-> ((Node, Node) -> Node) -> (Node, Node) -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node, Node) -> Node
forall a b. (a, b) -> b
snd)
parseFieldIfPresentWith :: (S.Node -> Parser a) -> Object -> T.Text -> Parser (Maybe a)
parseFieldIfPresentWith :: forall a. (Node -> Parser a) -> Object -> Text -> Parser (Maybe a)
parseFieldIfPresentWith Node -> Parser a
p = ((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a.
((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
entryFieldIfPresent ((Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
p (Node -> Parser a)
-> ((Node, Node) -> Node) -> (Node, Node) -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node, Node) -> Node
forall a b. (a, b) -> b
snd)
parseFieldDefaultWith :: (S.Node -> Parser a) -> Object -> T.Text -> a -> Parser a
parseFieldDefaultWith :: forall a. (Node -> Parser a) -> Object -> Text -> a -> Parser a
parseFieldDefaultWith Node -> Parser a
p Object
o Text
key a
def = a -> Maybe a -> a
forall a. a -> Maybe a -> a
fromMaybe a
def (Maybe a -> a) -> Parser (Maybe a) -> Parser a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Node -> Parser a) -> Object -> Text -> Parser (Maybe a)
forall a. (Node -> Parser a) -> Object -> Text -> Parser (Maybe a)
parseFieldMaybeWith Node -> Parser a
p Object
o Text
key
entryField :: ((S.Node, S.Node) -> Parser a) -> Object -> T.Text -> Parser a
entryField :: forall a. ((Node, Node) -> Parser a) -> Object -> Text -> Parser a
entryField (Node, Node) -> Parser a
p Object
o Text
key = case Text -> Map Text (Node, Node) -> Maybe (Node, Node)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Text
key Object
o.index of
Just (Node, Node)
entry -> (Node, Node) -> Parser a
p (Node, Node)
entry
Maybe (Node, Node)
Nothing -> Object -> Text -> Parser a
forall a. Object -> Text -> Parser a
missingKey Object
o Text
key
entryFieldMaybe :: ((S.Node, S.Node) -> Parser a) -> Object -> T.Text -> Parser (Maybe a)
entryFieldMaybe :: forall a.
((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
entryFieldMaybe (Node, Node) -> Parser a
p Object
o Text
key =
Object -> Text -> Parser (Maybe (Node, Node))
findKey Object
o Text
key Parser (Maybe (Node, Node))
-> (Maybe (Node, Node) -> Parser (Maybe a)) -> Parser (Maybe a)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Just (Node
_, Node
v) | Node -> Bool
isNullNode Node
v -> Maybe a -> Parser (Maybe a)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
Maybe (Node, Node)
entry -> ((Node, Node) -> Parser a)
-> Maybe (Node, Node) -> Parser (Maybe a)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (Node, Node) -> Parser a
p Maybe (Node, Node)
entry
entryFieldIfPresent
:: ((S.Node, S.Node) -> Parser a) -> Object -> T.Text -> Parser (Maybe a)
entryFieldIfPresent :: forall a.
((Node, Node) -> Parser a) -> Object -> Text -> Parser (Maybe a)
entryFieldIfPresent (Node, Node) -> Parser a
p Object
o Text
key = Object -> Text -> Parser (Maybe (Node, Node))
findKey Object
o Text
key Parser (Maybe (Node, Node))
-> (Maybe (Node, Node) -> Parser (Maybe a)) -> Parser (Maybe a)
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ((Node, Node) -> Parser a)
-> Maybe (Node, Node) -> Parser (Maybe a)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse (Node, Node) -> Parser a
p
parseEntry :: FromYaml a => (S.Node, S.Node) -> Parser a
parseEntry :: forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry (Node
k, Node
v) = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode (Node -> Node -> Parser a
forall a. FromYaml a => Node -> Node -> Parser a
parseYamlField Node
k) Node
v
findKey :: Object -> T.Text -> Parser (Maybe (S.Node, S.Node))
findKey :: Object -> Text -> Parser (Maybe (Node, Node))
findKey Object
o Text
key = case Text -> Map Text (Node, Node) -> Maybe (Node, Node)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Text
key Object
o.index of
Just (Node, Node)
entry -> Maybe (Node, Node) -> Parser (Maybe (Node, Node))
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Node, Node) -> Maybe (Node, Node)
forall a. a -> Maybe a
Just (Node, Node)
entry)
Maybe (Node, Node)
Nothing -> case ((Node, Value) -> Bool) -> [(Node, Value)] -> Maybe (Node, Value)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
L.find (Node -> Bool
sameText (Node -> Bool) -> ((Node, Value) -> Node) -> (Node, Value) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node, Value) -> Node
forall a b. (a, b) -> a
fst) Object
o.otherKeys of
Just (Node
k, Value
v) ->
Node -> [Char] -> Parser (Maybe (Node, Node))
forall a. Node -> [Char] -> Parser a
failAt Node
k ([Char] -> Parser (Maybe (Node, Node)))
-> [Char] -> Parser (Maybe (Node, Node))
forall a b. (a -> b) -> a -> b
$ [Char]
"the key " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
key [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" is " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Value -> [Char]
describe Value
v [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
", not a string"
Maybe (Node, Value)
Nothing -> Maybe (Node, Node) -> Parser (Maybe (Node, Node))
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (Node, Node)
forall a. Maybe a
Nothing
where
sameText :: S.Node -> Bool
sameText :: Node -> Bool
sameText Node
k = case Node
k.content of
S.ScalarContent ScalarStyle
_ Text
t -> Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
key
Content
_ -> Bool
False
missingKey :: Object -> T.Text -> Parser a
missingKey :: forall a. Object -> Text -> Parser a
missingKey Object
o Text
key = (Offset -> Result a) -> Parser a
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result a) -> Parser a)
-> (Offset -> Result a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \Offset
off ->
let Parser Offset -> Result (Maybe (Node, Node))
g = Object -> Text -> Parser (Maybe (Node, Node))
findKey Object
o Text
key
in case Offset -> Result (Maybe (Node, Node))
g Offset
off of
Result Errors
NoErrors Maybe (Node, Node)
_
| Text -> Map Text (Node, Node) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
M.member Text
"<<" Object
o.index ->
Offset -> [Char] -> Result a
forall a. Offset -> [Char] -> Result a
failure Object
o.node.offset ([Char]
"missing key " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
key [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
noMergeKeys)
| Bool
otherwise -> Offset -> [Char] -> Result a
forall a. Offset -> [Char] -> Result a
failure Object
o.node.offset ([Char]
"missing key " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
key)
Result Errors
e Maybe (Node, Node)
_ -> Errors -> a -> Result a
forall a. Errors -> a -> Result a
Result Errors
e a
forall a. a
failed
rejectUnknownKeys :: [T.Text] -> Object -> Parser ()
rejectUnknownKeys :: [Text] -> Object -> Parser ()
rejectUnknownKeys [Text]
known Object
o
| Map Text (Node, Node) -> Int
forall k a. Map k a -> Int
M.size Object
o.index Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [(Node, Node)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Object
o.entries
Bool -> Bool -> Bool
&& (Bool -> Text -> (Node, Node) -> Bool)
-> Bool -> Map Text (Node, Node) -> Bool
forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
M.foldlWithKey' (\Bool
r Text
k (Node, Node)
_ -> Bool
r Bool -> Bool -> Bool
&& Text -> Bool
isKnown Text
k) Bool
True Object
o.index =
() -> Parser ()
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
| Bool
otherwise = Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
True [] Object
o.entries
where
isKnown :: T.Text -> Bool
isKnown :: Text -> Bool
isKnown Text
t = (Text -> Bool) -> [Text] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
t) [Text]
known
go :: Bool -> [T.Text] -> [(S.Node, S.Node)] -> Parser ()
go :: Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
unlisted [Text]
reported = \case
[] -> () -> Parser ()
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
(Node
k, Node
_) : [(Node, Node)]
rest -> case Node -> Maybe Text
stringValue Node
k of
Just Text
t
| Text -> Bool
isKnown Text
t -> Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
unlisted [Text]
reported [(Node, Node)]
rest
| Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"<<" -> Node -> Text -> [Char] -> Parser ()
unknown Node
k Text
t [Char]
noMergeKeys Parser () -> Parser () -> Parser ()
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
unlisted [Text]
reported [(Node, Node)]
rest
| Just Text
s <- [Text] -> Text -> Maybe Text
closeName [Text]
known Text
t ->
Node -> Text -> [Char] -> Parser ()
unknown Node
k Text
t (Text -> [Char]
didYouMean Text
s) Parser () -> Parser () -> Parser ()
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
unlisted [Text]
reported [(Node, Node)]
rest
| Bool
unlisted ->
Node -> Text -> [Char] -> Parser ()
unknown
Node
k
Text
t
( if [Text] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Text]
known
then [Char]
", the mapping must be empty"
else [Text] -> [Char]
expectedOneOf [Text]
known
)
Parser () -> Parser () -> Parser ()
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
False [Text]
reported [(Node, Node)]
rest
| Bool
otherwise -> Node -> Text -> [Char] -> Parser ()
unknown Node
k Text
t [Char]
"" Parser () -> Parser () -> Parser ()
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
False [Text]
reported [(Node, Node)]
rest
Maybe Text
_
| S.ScalarContent ScalarStyle
_ Text
t <- Node
k.content
, Text -> Bool
isKnown Text
t
, Bool -> Bool
not (Text -> Map Text (Node, Node) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
M.member Text
t Object
o.index)
, Bool -> Bool
not ((Text -> Bool) -> [Text] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
t) [Text]
reported) ->
Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
unlisted (Text
t Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: [Text]
reported) [(Node, Node)]
rest
| Bool
otherwise ->
[Char] -> Node -> Parser (ZonkAny 0)
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a string as the key" Node
k Parser (ZonkAny 0) -> Parser () -> Parser ()
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> [Text] -> [(Node, Node)] -> Parser ()
go Bool
unlisted [Text]
reported [(Node, Node)]
rest
unknown :: S.Node -> T.Text -> String -> Parser ()
unknown :: Node -> Text -> [Char] -> Parser ()
unknown Node
k Text
t [Char]
hint = Node -> [Char] -> Parser ()
forall a. Node -> [Char] -> Parser a
failAt Node
k ([Char] -> Parser ()) -> [Char] -> Parser ()
forall a b. (a -> b) -> a -> b
$ [Char]
"unknown key " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
hint
unknownName :: String -> [T.Text] -> S.Node -> T.Text -> Parser a
unknownName :: forall a. [Char] -> [Text] -> Node -> Text -> Parser a
unknownName [Char]
what [Text]
known Node
n Text
t =
Node -> [Char] -> Parser a
forall a. Node -> [Char] -> Parser a
failAt Node
n ([Char] -> Parser a) -> [Char] -> Parser a
forall a b. (a -> b) -> a -> b
$ [Char]
"unknown " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
what [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
hint
where
hint :: String
hint :: [Char]
hint
| [Text] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Text]
known = [Char]
", no " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
what [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" is accepted"
| Bool
otherwise = [Char] -> (Text -> [Char]) -> Maybe Text -> [Char]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Text] -> [Char]
expectedOneOf [Text]
known) Text -> [Char]
didYouMean ([Text] -> Text -> Maybe Text
closeName [Text]
known Text
t)
didYouMean :: T.Text -> String
didYouMean :: Text -> [Char]
didYouMean Text
s = [Char]
", did you mean " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
showText Text
s [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"?"
expectedOneOf :: [T.Text] -> String
expectedOneOf :: [Text] -> [Char]
expectedOneOf [Text]
known = [Char]
", expected one of: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
L.intercalate [Char]
", " ((Text -> [Char]) -> [Text] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map Text -> [Char]
T.unpack [Text]
known)
closeName :: [T.Text] -> T.Text -> Maybe T.Text
closeName :: [Text] -> Text -> Maybe Text
closeName [Text]
known Text
t =
case ((Int, Text) -> Int) -> [(Int, Text)] -> [(Int, Text)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
L.sortOn
(Int, Text) -> Int
forall a b. (a, b) -> a
fst
[ (Int
d, Text
s)
| Text
s <- [Text]
known
, Int -> Int
forall a. Num a => a -> a
abs (Text -> Int
T.length Text
s Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxEdits
, let d :: Int
d = [Char] -> [Char] -> Int
distance (Text -> [Char]
T.unpack Text
t) (Text -> [Char]
T.unpack Text
s)
, Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
maxEdits
, Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n
] of
(Int
_, Text
s) : [(Int, Text)]
_ -> Text -> Maybe Text
forall a. a -> Maybe a
Just Text
s
[] -> Maybe Text
forall a. Maybe a
Nothing
where
n :: Int
n :: Int
n = Text -> Int
T.length Text
t
maxEdits :: Int
maxEdits :: Int
maxEdits = Int
2
distance :: String -> String -> Int
distance :: [Char] -> [Char] -> Int
distance [Char]
xs [Char]
ys = case [Int] -> [Int]
forall a. [a] -> [a]
reverse (([Int] -> (Int, Char) -> [Int]) -> [Int] -> [(Int, Char)] -> [Int]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
L.foldl' [Int] -> (Int, Char) -> [Int]
nextRow [Int
0 .. [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Char]
ys] ([Int] -> [Char] -> [(Int, Char)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
1 ..] [Char]
xs)) of
Int
d : [Int]
_ -> Int
d
[] -> [Char] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Char]
ys
where
nextRow :: [Int] -> (Int, Char) -> [Int]
nextRow :: [Int] -> (Int, Char) -> [Int]
nextRow [Int]
row (Int
i, Char
x) = (Int -> (Char, Int, Int) -> Int)
-> Int -> [(Char, Int, Int)] -> [Int]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl Int -> (Char, Int, Int) -> Int
cell Int
i ([Char] -> [Int] -> [Int] -> [(Char, Int, Int)]
forall a b c. [a] -> [b] -> [c] -> [(a, b, c)]
zip3 [Char]
ys [Int]
row (Int -> [Int] -> [Int]
forall a. Int -> [a] -> [a]
drop Int
1 [Int]
row))
where
cell :: Int -> (Char, Int, Int) -> Int
cell :: Int -> (Char, Int, Int) -> Int
cell Int
left (Char
y, Int
diagonal, Int
above) =
[Int] -> Int
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum [Int
left Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1, Int
above Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1, Int
diagonal Int -> Int -> Int
forall a. Num a => a -> a -> a
+ if Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
y then Int
0 else Int
1]
class FromYaml a where
parseYaml :: S.Node -> Parser a
parseYamlList :: S.Node -> Parser [a]
parseYamlList = ([Node] -> Parser [a]) -> Node -> Parser [a]
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence ((Node -> Parser a) -> [Node] -> Parser [a]
forall a. (Node -> Parser a) -> [Node] -> Parser [a]
parseItems Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml)
parseYamlField :: S.Node -> S.Node -> Parser a
parseYamlField Node
_ = Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml
instance FromYaml S.Node where
parseYaml :: Node -> Parser Node
parseYaml Node
n = Node -> Parser Node
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Node -> Parser Node) -> Node -> Parser Node
forall a b. (a -> b) -> a -> b
$! Node -> Node
S.copyNode Node
n
instance FromYaml a => FromYaml (S.Commented a) where
parseYaml :: Node -> Parser (Commented a)
parseYaml Node
v =
(a -> Comments -> Commented a) -> Comments -> a -> Commented a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> Comments -> Commented a
forall a. a -> Comments -> Commented a
S.Commented (Comments -> Comments
S.copyComments Node
v.comments)
(a -> Commented a) -> Parser a -> Parser (Commented a)
forall (m :: * -> *) a b. Monad m => (a -> b) -> m a -> m b
<$!> Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml (Comments -> Node -> Node
S.withComments Comments
S.noComments Node
v)
parseYamlField :: Node -> Node -> Parser (Commented a)
parseYamlField Node
k Node
v =
(a -> Comments -> Commented a) -> Comments -> a -> Commented a
forall a b c. (a -> b -> c) -> b -> a -> c
flip
a -> Comments -> Commented a
forall a. a -> Comments -> Commented a
S.Commented
( Comments -> Comments
S.copyComments
(S.Comments {before :: [Line]
S.before = [Line]
before, inline :: Maybe Text
S.inline = Maybe Text
inline, after :: [Line]
S.after = Node
v.comments.after})
)
(a -> Commented a) -> Parser a -> Parser (Commented a)
forall (m :: * -> *) a b. Monad m => (a -> b) -> m a -> m b
<$!> Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml Node
value
where
block :: Bool
block :: Bool
block = case Node
v.content of
S.SequenceContent CollectionStyle
S.Block (Node
_ : [Node]
_) -> Bool
True
S.MappingContent CollectionStyle
S.Block ((Node, Node)
_ : [(Node, Node)]
_) -> Bool
True
Content
_ -> Bool
False
above :: [S.Line]
above :: [Line]
above = Node
k.comments.before [Line] -> [Line] -> [Line]
forall a. [a] -> [a] -> [a]
++ if Bool
block then [] else Node
v.comments.before
before :: [S.Line]
inline :: Maybe T.Text
([Line]
before, Maybe Text
inline) = case (Node
k.comments.inline, Node
v.comments.inline) of
(Just Text
kc, Just Text
vc) -> ([Line]
above [Line] -> [Line] -> [Line]
forall a. [a] -> [a] -> [a]
++ [Text -> Line
S.Comment Text
kc], Text -> Maybe Text
forall a. a -> Maybe a
Just Text
vc)
(Maybe Text
kc, Maybe Text
vc) -> ([Line]
above, Maybe Text
vc Maybe Text -> Maybe Text -> Maybe Text
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Text
kc)
value :: S.Node
value :: Node
value =
let rest :: Comments
rest =
S.Comments
{ before :: [Line]
S.before = if Bool
block then Node
v.comments.before else []
, inline :: Maybe Text
S.inline = Maybe Text
forall a. Maybe a
Nothing
, after :: [Line]
S.after = []
}
in Comments -> Node -> Node
S.withComments Comments
rest Node
v
instance FromYaml a => FromYaml (S.Located a) where
parseYaml :: Node -> Parser (Located a)
parseYaml Node
n = (a -> Offset -> Located a) -> Offset -> a -> Located a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> Offset -> Located a
forall a. a -> Offset -> Located a
S.Located Node
n.offset (a -> Located a) -> Parser a -> Parser (Located a)
forall (m :: * -> *) a b. Monad m => (a -> b) -> m a -> m b
<$!> Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml Node
n
parseYamlField :: Node -> Node -> Parser (Located a)
parseYamlField Node
k Node
n = (a -> Offset -> Located a) -> Offset -> a -> Located a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> Offset -> Located a
forall a. a -> Offset -> Located a
S.Located Node
n.offset (a -> Located a) -> Parser a -> Parser (Located a)
forall (m :: * -> *) a b. Monad m => (a -> b) -> m a -> m b
<$!> Node -> Node -> Parser a
forall a. FromYaml a => Node -> Node -> Parser a
parseYamlField Node
k Node
n
instance FromYaml Value where
parseYaml :: Node -> Parser Value
parseYaml Node
n = case Node -> Either (NonEmpty (Offset, [Char])) Value
representPrepared Node
n of
Right Value
r -> Value -> Parser Value
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Parser Value) -> Value -> Parser Value
forall a b. (a -> b) -> a -> b
$! Value -> Value
copy Value
r
Left ((Offset
off, [Char]
msg) NE.:| [(Offset, [Char])]
notes) -> (Offset -> Result Value) -> Parser Value
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result Value) -> Parser Value)
-> (Offset -> Result Value) -> Parser Value
forall a b. (a -> b) -> a -> b
$ \Offset
_ -> Errors -> Value -> Result Value
forall a. Errors -> a -> Result a
Result (Offset -> [Char] -> [(Offset, [Char])] -> Errors
OneError Offset
off [Char]
msg [(Offset, [Char])]
notes) Value
forall a. a
failed
where
copy :: Value -> Value
copy :: Value -> Value
copy = \case
String Text
t -> Text -> Value
String (Text -> Text
T.copy Text
t)
Sequence [Value]
xs -> [Value] -> Value
Sequence ((Value -> Value) -> [Value] -> [Value]
forall a b. (a -> b) -> [a] -> [b]
strictMap Value -> Value
copy [Value]
xs)
Mapping [(Value, Value)]
kvs -> [(Value, Value)] -> Value
Mapping (((Value, Value) -> (Value, Value))
-> [(Value, Value)] -> [(Value, Value)]
forall a b. (a -> b) -> [a] -> [b]
strictMap (\(Value
k, Value
v) -> Value -> Value -> (Value, Value)
forall a b. a -> b -> (a, b)
strictPair (Value -> Value
copy Value
k) (Value -> Value
copy Value
v)) [(Value, Value)]
kvs)
Tagged Text
tag Value
v -> Text -> Value -> Value
Tagged (Text -> Text
T.copy Text
tag) (Value -> Value
copy Value
v)
Value
v -> Value
v
instance FromYaml () where
parseYaml :: Node -> Parser ()
parseYaml = (Node -> Parser ()) -> Node -> Parser ()
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser ()) -> Node -> Parser ())
-> (Node -> Parser ()) -> Node -> Parser ()
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node -> View
view Node
n of
SequenceView [] -> () -> Parser ()
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
View
_ -> [Char] -> Node -> Parser ()
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"an empty list" Node
n
instance FromYaml Bool where
parseYaml :: Node -> Parser Bool
parseYaml = (Bool -> Parser Bool) -> Node -> Parser Bool
forall a. (Bool -> Parser a) -> Node -> Parser a
withBool Bool -> Parser Bool
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance FromYaml Integer where
parseYaml :: Node -> Parser Integer
parseYaml = (Integer -> Parser Integer) -> Node -> Parser Integer
forall a. (Integer -> Parser a) -> Node -> Parser a
withInt Integer -> Parser Integer
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance FromYaml Natural where
parseYaml :: Node -> Parser Natural
parseYaml = (Integer -> Parser Natural) -> Node -> Parser Natural
forall a. (Integer -> Parser a) -> Node -> Parser a
withInt ((Integer -> Parser Natural) -> Node -> Parser Natural)
-> (Integer -> Parser Natural) -> Node -> Parser Natural
forall a b. (a -> b) -> a -> b
$ \Integer
i ->
if Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
0
then [Char] -> Parser Natural
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a non-negative integer"
else Natural -> Parser Natural
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> Natural
forall a. Num a => Integer -> a
fromInteger Integer
i)
instance FromYaml Int where parseYaml :: Node -> Parser Int
parseYaml = Node -> Parser Int
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Int8 where parseYaml :: Node -> Parser Int8
parseYaml = Node -> Parser Int8
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Int16 where parseYaml :: Node -> Parser Int16
parseYaml = Node -> Parser Int16
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Int32 where parseYaml :: Node -> Parser Int32
parseYaml = Node -> Parser Int32
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Int64 where parseYaml :: Node -> Parser Int64
parseYaml = Node -> Parser Int64
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Word where parseYaml :: Node -> Parser Word
parseYaml = Node -> Parser Word
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Word8 where parseYaml :: Node -> Parser Word8
parseYaml = Node -> Parser Word8
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Word16 where parseYaml :: Node -> Parser Word16
parseYaml = Node -> Parser Word16
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Word32 where parseYaml :: Node -> Parser Word32
parseYaml = Node -> Parser Word32
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
instance FromYaml Word64 where parseYaml :: Node -> Parser Word64
parseYaml = Node -> Parser Word64
forall a. (Bounded a, Integral a) => Node -> Parser a
bounded
bounded :: forall a. (Bounded a, Integral a) => S.Node -> Parser a
bounded :: forall a. (Bounded a, Integral a) => Node -> Parser a
bounded = (Integer -> Parser a) -> Node -> Parser a
forall a. (Integer -> Parser a) -> Node -> Parser a
withInt ((Integer -> Parser a) -> Node -> Parser a)
-> (Integer -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ \Integer
i ->
if Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< a -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
minBound @a) Bool -> Bool -> Bool
|| Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> a -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
maxBound @a)
then
[Char] -> Parser a
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser a) -> [Char] -> Parser a
forall a b. (a -> b) -> a -> b
$
[Char]
"the integer is out of the range from "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Integer -> [Char]
forall a. Show a => a -> [Char]
show (a -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
minBound @a))
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" to "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Integer -> [Char]
forall a. Show a => a -> [Char]
show (a -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
maxBound @a))
else a -> Parser a
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
i)
instance FromYaml Double where
parseYaml :: Node -> Parser Double
parseYaml = (Double -> Parser Double) -> Node -> Parser Double
forall a. (Double -> Parser a) -> Node -> Parser a
withFloat Double -> Parser Double
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance FromYaml Sci.Scientific where
parseYaml :: Node -> Parser Scientific
parseYaml = (Scientific -> Parser Scientific) -> Node -> Parser Scientific
forall a. (Scientific -> Parser a) -> Node -> Parser a
withScientific Scientific -> Parser Scientific
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance FromYaml Day where
parseYaml :: Node -> Parser Day
parseYaml = [Char] -> (Text -> Either [Char] Day) -> Node -> Parser Day
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
"expected a date such as 2026-09-25" Text -> Either [Char] Day
parseDay
instance FromYaml TimeOfDay where
parseYaml :: Node -> Parser TimeOfDay
parseYaml = [Char]
-> (Text -> Either [Char] TimeOfDay) -> Node -> Parser TimeOfDay
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
"expected a time such as 12:30:00" Text -> Either [Char] TimeOfDay
parseTimeOfDay
instance FromYaml LocalTime where
parseYaml :: Node -> Parser LocalTime
parseYaml =
[Char]
-> (Text -> Either [Char] LocalTime) -> Node -> Parser LocalTime
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
"expected a date and a time such as 2026-09-25T12:30:00" Text -> Either [Char] LocalTime
parseLocalTime
instance FromYaml ZonedTime where
parseYaml :: Node -> Parser ZonedTime
parseYaml = [Char]
-> (Text -> Either [Char] ZonedTime) -> Node -> Parser ZonedTime
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
zonedTimeMismatch Text -> Either [Char] ZonedTime
parseZonedTime
instance FromYaml UTCTime where
parseYaml :: Node -> Parser UTCTime
parseYaml = [Char] -> (Text -> Either [Char] UTCTime) -> Node -> Parser UTCTime
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
zonedTimeMismatch Text -> Either [Char] UTCTime
parseUTCTime
instance FromYaml NominalDiffTime where
parseYaml :: Node -> Parser NominalDiffTime
parseYaml = (Scientific -> Parser NominalDiffTime)
-> Node -> Parser NominalDiffTime
forall a. (Scientific -> Parser a) -> Node -> Parser a
withScientific ((Scientific -> Parser NominalDiffTime)
-> Node -> Parser NominalDiffTime)
-> (Scientific -> Parser NominalDiffTime)
-> Node
-> Parser NominalDiffTime
forall a b. (a -> b) -> a -> b
$ NominalDiffTime -> Parser NominalDiffTime
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (NominalDiffTime -> Parser NominalDiffTime)
-> (Scientific -> NominalDiffTime)
-> Scientific
-> Parser NominalDiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pico -> NominalDiffTime
secondsToNominalDiffTime (Pico -> NominalDiffTime)
-> (Scientific -> Pico) -> Scientific -> NominalDiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Pico
forall k (a :: k). Integer -> Fixed a
MkFixed (Integer -> Pico) -> (Scientific -> Integer) -> Scientific -> Pico
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Integer
picoseconds
instance FromYaml DiffTime where
parseYaml :: Node -> Parser DiffTime
parseYaml = (Scientific -> Parser DiffTime) -> Node -> Parser DiffTime
forall a. (Scientific -> Parser a) -> Node -> Parser a
withScientific ((Scientific -> Parser DiffTime) -> Node -> Parser DiffTime)
-> (Scientific -> Parser DiffTime) -> Node -> Parser DiffTime
forall a b. (a -> b) -> a -> b
$ DiffTime -> Parser DiffTime
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DiffTime -> Parser DiffTime)
-> (Scientific -> DiffTime) -> Scientific -> Parser DiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> DiffTime
picosecondsToDiffTime (Integer -> DiffTime)
-> (Scientific -> Integer) -> Scientific -> DiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Scientific -> Integer
picoseconds
instance FromYaml UUID.UUID where
parseYaml :: Node -> Parser UUID
parseYaml =
(Text -> Parser UUID) -> Node -> Parser UUID
forall a. (Text -> Parser a) -> Node -> Parser a
withText ((Text -> Parser UUID) -> Node -> Parser UUID)
-> (Text -> Parser UUID) -> Node -> Parser UUID
forall a b. (a -> b) -> a -> b
$
Parser UUID -> (UUID -> Parser UUID) -> Maybe UUID -> Parser UUID
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> Parser UUID
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a UUID such as 123e4567-e89b-12d3-a456-426614174000") UUID -> Parser UUID
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
(Maybe UUID -> Parser UUID)
-> (Text -> Maybe UUID) -> Text -> Parser UUID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe UUID
UUID.fromText
instance FromYaml Month where
parseYaml :: Node -> Parser Month
parseYaml = [Char] -> (Text -> Either [Char] Month) -> Node -> Parser Month
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
"expected a month such as 2026-09" Text -> Either [Char] Month
parseMonth
instance FromYaml Quarter where
parseYaml :: Node -> Parser Quarter
parseYaml = [Char] -> (Text -> Either [Char] Quarter) -> Node -> Parser Quarter
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
"expected a quarter such as 2026-q3" Text -> Either [Char] Quarter
parseQuarter
instance FromYaml QuarterOfYear where
parseYaml :: Node -> Parser QuarterOfYear
parseYaml = [Char]
-> (Text -> Either [Char] QuarterOfYear)
-> Node
-> Parser QuarterOfYear
forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
"expected a quarter of a year such as q3" Text -> Either [Char] QuarterOfYear
parseQuarterOfYear
instance FromYaml DayOfWeek where
parseYaml :: Node -> Parser DayOfWeek
parseYaml = (Text -> Parser DayOfWeek) -> Node -> Parser DayOfWeek
forall a. (Text -> Parser a) -> Node -> Parser a
withText ((Text -> Parser DayOfWeek) -> Node -> Parser DayOfWeek)
-> (Text -> Parser DayOfWeek) -> Node -> Parser DayOfWeek
forall a b. (a -> b) -> a -> b
$ \Text
t ->
Parser DayOfWeek
-> (DayOfWeek -> Parser DayOfWeek)
-> Maybe DayOfWeek
-> Parser DayOfWeek
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> Parser DayOfWeek
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a day of the week such as monday") DayOfWeek -> Parser DayOfWeek
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe DayOfWeek -> Parser DayOfWeek)
-> Maybe DayOfWeek -> Parser DayOfWeek
forall a b. (a -> b) -> a -> b
$
Text -> [(Text, DayOfWeek)] -> Maybe DayOfWeek
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup (Text -> Text
T.toLower Text
t) [(Text -> Text
T.toLower ([Char] -> Text
T.pack (DayOfWeek -> [Char]
forall a. Show a => a -> [Char]
show DayOfWeek
d)), DayOfWeek
d) | DayOfWeek
d <- [DayOfWeek
Monday .. DayOfWeek
Sunday]]
instance FromYaml CalendarDiffDays where
parseYaml :: Node -> Parser CalendarDiffDays
parseYaml = (Object -> Parser CalendarDiffDays)
-> Node -> Parser CalendarDiffDays
forall a. (Object -> Parser a) -> Node -> Parser a
withMapping ((Object -> Parser CalendarDiffDays)
-> Node -> Parser CalendarDiffDays)
-> (Object -> Parser CalendarDiffDays)
-> Node
-> Parser CalendarDiffDays
forall a b. (a -> b) -> a -> b
$ \Object
o ->
[Text] -> Object -> Parser ()
rejectUnknownKeys [Text
"months", Text
"days"] Object
o
Parser () -> Parser CalendarDiffDays -> Parser CalendarDiffDays
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Integer -> Integer -> CalendarDiffDays
CalendarDiffDays (Integer -> Integer -> CalendarDiffDays)
-> Parser Integer -> Parser (Integer -> CalendarDiffDays)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object -> Text -> Parser Integer
forall a. FromYaml a => Object -> Text -> Parser a
parseField Object
o Text
"months" Parser (Integer -> CalendarDiffDays)
-> Parser Integer -> Parser CalendarDiffDays
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object -> Text -> Parser Integer
forall a. FromYaml a => Object -> Text -> Parser a
parseField Object
o Text
"days")
instance FromYaml CalendarDiffTime where
parseYaml :: Node -> Parser CalendarDiffTime
parseYaml = (Object -> Parser CalendarDiffTime)
-> Node -> Parser CalendarDiffTime
forall a. (Object -> Parser a) -> Node -> Parser a
withMapping ((Object -> Parser CalendarDiffTime)
-> Node -> Parser CalendarDiffTime)
-> (Object -> Parser CalendarDiffTime)
-> Node
-> Parser CalendarDiffTime
forall a b. (a -> b) -> a -> b
$ \Object
o ->
[Text] -> Object -> Parser ()
rejectUnknownKeys [Text
"months", Text
"time"] Object
o
Parser () -> Parser CalendarDiffTime -> Parser CalendarDiffTime
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Integer -> NominalDiffTime -> CalendarDiffTime
CalendarDiffTime (Integer -> NominalDiffTime -> CalendarDiffTime)
-> Parser Integer -> Parser (NominalDiffTime -> CalendarDiffTime)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object -> Text -> Parser Integer
forall a. FromYaml a => Object -> Text -> Parser a
parseField Object
o Text
"months" Parser (NominalDiffTime -> CalendarDiffTime)
-> Parser NominalDiffTime -> Parser CalendarDiffTime
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object -> Text -> Parser NominalDiffTime
forall a. FromYaml a => Object -> Text -> Parser a
parseField Object
o Text
"time")
zonedTimeMismatch :: String
zonedTimeMismatch :: [Char]
zonedTimeMismatch = [Char]
"expected a date, a time and a time zone such as 2026-09-25T12:30:00Z"
withIso8601 :: String -> (T.Text -> Either String a) -> S.Node -> Parser a
withIso8601 :: forall a. [Char] -> (Text -> Either [Char] a) -> Node -> Parser a
withIso8601 [Char]
mismatch Text -> Either [Char] a
p = (Text -> Parser a) -> Node -> Parser a
forall a. (Text -> Parser a) -> Node -> Parser a
withText ((Text -> Parser a) -> Node -> Parser a)
-> (Text -> Parser a) -> Node -> Parser a
forall a b. (a -> b) -> a -> b
$ ([Char] -> Parser a)
-> (a -> Parser a) -> Either [Char] a -> Parser a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Parser a -> [Char] -> Parser a
forall a b. a -> b -> a
const ([Char] -> Parser a
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
mismatch)) a -> Parser a
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either [Char] a -> Parser a)
-> (Text -> Either [Char] a) -> Text -> Parser a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either [Char] a
p
picoseconds :: Sci.Scientific -> Integer
picoseconds :: Scientific -> Integer
picoseconds Scientific
s
| Integer
k Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= Integer
0 = Integer
c Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
10 Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ Integer
k
| Bool
otherwise = Integer
c Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` Integer
10 Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ Integer -> Integer
forall a. Num a => a -> a
negate Integer
k
where
c :: Integer
c :: Integer
c = Scientific -> Integer
Sci.coefficient Scientific
s
k :: Integer
k :: Integer
k = Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Scientific -> Int
Sci.base10Exponent Scientific
s) Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Int -> Integer
forall a. Integral a => a -> Integer
toInteger Int
picoDecimals
instance FromYaml Float where
parseYaml :: Node -> Parser Float
parseYaml = (Float -> Parser Float) -> Node -> Parser Float
forall b a. RealFloat b => (b -> Parser a) -> Node -> Parser a
withRealFloat Float -> Parser Float
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance FromYaml T.Text where
parseYaml :: Node -> Parser Text
parseYaml = (Text -> Parser Text) -> Node -> Parser Text
forall a. (Text -> Parser a) -> Node -> Parser a
withText Text -> Parser Text
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
instance FromYaml TL.Text where
parseYaml :: Node -> Parser Text
parseYaml = (Text -> Parser Text) -> Node -> Parser Text
forall a. (Text -> Parser a) -> Node -> Parser a
withText (Text -> Parser Text
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> Parser Text) -> (Text -> Text) -> Text -> Parser Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
TL.fromStrict)
instance FromYaml Char where
parseYaml :: Node -> Parser Char
parseYaml = (Text -> Parser Char) -> Node -> Parser Char
forall a. (Text -> Parser a) -> Node -> Parser a
withText ((Text -> Parser Char) -> Node -> Parser Char)
-> (Text -> Parser Char) -> Node -> Parser Char
forall a b. (a -> b) -> a -> b
$ \Text
t -> case Text -> [Char]
T.unpack Text
t of
[Char
c] -> Char -> Parser Char
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Char
c
[Char]
_ -> [Char] -> Parser Char
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a single character"
parseYamlList :: Node -> Parser [Char]
parseYamlList = (Text -> Parser [Char]) -> Node -> Parser [Char]
forall a. (Text -> Parser a) -> Node -> Parser a
withText ([Char] -> Parser [Char]
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Char] -> Parser [Char])
-> (Text -> [Char]) -> Text -> Parser [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Char]
T.unpack)
instance FromYaml a => FromYaml [a] where
parseYaml :: Node -> Parser [a]
parseYaml = Node -> Parser [a]
forall a. FromYaml a => Node -> Parser [a]
parseYamlList
instance FromYaml a => FromYaml (NE.NonEmpty a) where
parseYaml :: Node -> Parser (NonEmpty a)
parseYaml = ([Node] -> Parser (NonEmpty a)) -> Node -> Parser (NonEmpty a)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (NonEmpty a)) -> Node -> Parser (NonEmpty a))
-> ([Node] -> Parser (NonEmpty a)) -> Node -> Parser (NonEmpty a)
forall a b. (a -> b) -> a -> b
$ \case
[] -> [Char] -> Parser (NonEmpty a)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a non-empty list"
Node
x : [Node]
xs -> a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
(NE.:|) (a -> [a] -> NonEmpty a) -> Parser a -> Parser ([a] -> NonEmpty a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml Node
x Parser ([a] -> NonEmpty a) -> Parser [a] -> Parser (NonEmpty a)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Node -> Parser a) -> [Node] -> Parser [a]
forall a. (Node -> Parser a) -> [Node] -> Parser [a]
parseItems Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml [Node]
xs
instance FromYaml a => FromYaml (Maybe a) where
parseYaml :: Node -> Parser (Maybe a)
parseYaml Node
n = case Node -> View
view Node
n of
View
NullView -> Maybe a -> Parser (Maybe a)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
View
_ -> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Parser a -> Parser (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml Node
n
parseYamlField :: Node -> Node -> Parser (Maybe a)
parseYamlField Node
k Node
n = case Node -> View
view Node
n of
View
NullView -> Maybe a -> Parser (Maybe a)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe a
forall a. Maybe a
Nothing
View
_ -> a -> Maybe a
forall a. a -> Maybe a
Just (a -> Maybe a) -> Parser a -> Parser (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Node -> Parser a
forall a. FromYaml a => Node -> Node -> Parser a
parseYamlField Node
k Node
n
instance (Ord k, FromYaml k, FromYaml v) => FromYaml (M.Map k v) where
parseYaml :: Node -> Parser (Map k v)
parseYaml = ((Maybe v -> (Bool, Maybe v)) -> k -> Map k v -> (Bool, Map k v))
-> Map k v -> Node -> Parser (Map k v)
forall k v m.
(Ord k, FromYaml k, FromYaml v) =>
((Maybe v -> (Bool, Maybe v)) -> k -> m -> (Bool, m))
-> m -> Node -> Parser m
uniqueEntries (Maybe v -> (Bool, Maybe v)) -> k -> Map k v -> (Bool, Map k v)
forall (f :: * -> *) k a.
(Functor f, Ord k) =>
(Maybe a -> f (Maybe a)) -> k -> Map k a -> f (Map k a)
M.alterF Map k v
forall k a. Map k a
M.empty
instance FromYaml v => FromYaml (IM.IntMap v) where
parseYaml :: Node -> Parser (IntMap v)
parseYaml = ((Maybe v -> (Bool, Maybe v))
-> Int -> IntMap v -> (Bool, IntMap v))
-> IntMap v -> Node -> Parser (IntMap v)
forall k v m.
(Ord k, FromYaml k, FromYaml v) =>
((Maybe v -> (Bool, Maybe v)) -> k -> m -> (Bool, m))
-> m -> Node -> Parser m
uniqueEntries (Maybe v -> (Bool, Maybe v)) -> Int -> IntMap v -> (Bool, IntMap v)
forall (f :: * -> *) a.
Functor f =>
(Maybe a -> f (Maybe a)) -> Int -> IntMap a -> f (IntMap a)
IM.alterF IntMap v
forall a. IntMap a
IM.empty
instance (Ord a, FromYaml a) => FromYaml (Set.Set a) where
parseYaml :: Node -> Parser (Set a)
parseYaml =
([Node] -> Parser (Set a)) -> Node -> Parser (Set a)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (Set a)) -> Node -> Parser (Set a))
-> ([Node] -> Parser (Set a)) -> Node -> Parser (Set a)
forall a b. (a -> b) -> a -> b
$
(Node -> Node)
-> (Node -> Parser a)
-> (a -> a)
-> (a -> Set a -> (Bool, Set a))
-> Set a
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [Node]
-> Parser (Set a)
forall a x s c.
Ord c =>
(a -> Node)
-> (a -> Parser x)
-> (x -> c)
-> (x -> s -> (Bool, s))
-> s
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [a]
-> Parser s
insertUnique
Node -> Node
forall a. a -> a
id
((Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml)
a -> a
forall a. a -> a
id
((Bool -> (Bool, Bool)) -> a -> Set a -> (Bool, Set a)
forall a (f :: * -> *).
(Ord a, Functor f) =>
(Bool -> f Bool) -> a -> Set a -> f (Set a)
Set.alterF (,Bool
True))
Set a
forall a. Set a
Set.empty
([Char]
"duplicate element" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)
([Char]
"the first element" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)
instance FromYaml IS.IntSet where
parseYaml :: Node -> Parser IntSet
parseYaml =
([Node] -> Parser IntSet) -> Node -> Parser IntSet
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser IntSet) -> Node -> Parser IntSet)
-> ([Node] -> Parser IntSet) -> Node -> Parser IntSet
forall a b. (a -> b) -> a -> b
$
(Node -> Node)
-> (Node -> Parser Int)
-> (Int -> Int)
-> (Int -> IntSet -> (Bool, IntSet))
-> IntSet
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [Node]
-> Parser IntSet
forall a x s c.
Ord c =>
(a -> Node)
-> (a -> Parser x)
-> (x -> c)
-> (x -> s -> (Bool, s))
-> s
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [a]
-> Parser s
insertUnique
Node -> Node
forall a. a -> a
id
((Node -> Parser Int) -> Node -> Parser Int
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser Int
forall a. FromYaml a => Node -> Parser a
parseYaml)
Int -> Int
forall a. a -> a
id
((Bool -> (Bool, Bool)) -> Int -> IntSet -> (Bool, IntSet)
forall (f :: * -> *).
Functor f =>
(Bool -> f Bool) -> Int -> IntSet -> f IntSet
IS.alterF (,Bool
True))
IntSet
IS.empty
([Char]
"duplicate element" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)
([Char]
"the first element" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)
uniqueEntries
:: (Ord k, FromYaml k, FromYaml v)
=> ((Maybe v -> (Bool, Maybe v)) -> k -> m -> (Bool, m)) -> m -> S.Node -> Parser m
uniqueEntries :: forall k v m.
(Ord k, FromYaml k, FromYaml v) =>
((Maybe v -> (Bool, Maybe v)) -> k -> m -> (Bool, m))
-> m -> Node -> Parser m
uniqueEntries (Maybe v -> (Bool, Maybe v)) -> k -> m -> (Bool, m)
alter m
none = (Node -> Parser m) -> Node -> Parser m
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode ((Node -> Parser m) -> Node -> Parser m)
-> (Node -> Parser m) -> Node -> Parser m
forall a b. (a -> b) -> a -> b
$ \Node
n -> case Node
n.content of
S.MappingContent CollectionStyle
_ [(Node, Node)]
kvs ->
((Node, Node) -> Node)
-> ((Node, Node) -> Parser (k, v))
-> ((k, v) -> k)
-> ((k, v) -> m -> (Bool, m))
-> m
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [(Node, Node)]
-> Parser m
forall a x s c.
Ord c =>
(a -> Node)
-> (a -> Parser x)
-> (x -> c)
-> (x -> s -> (Bool, s))
-> s
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [a]
-> Parser s
insertUnique
(Node, Node) -> Node
forall a b. (a, b) -> a
fst
(Node, Node) -> Parser (k, v)
forall k v.
(FromYaml k, FromYaml v) =>
(Node, Node) -> Parser (k, v)
entry
(k, v) -> k
forall a b. (a, b) -> a
fst
(\(k
k, v
v) -> (Maybe v -> (Bool, Maybe v)) -> k -> m -> (Bool, m)
alter (\Maybe v
old -> (Maybe v -> Bool
forall a. Maybe a -> Bool
isJust Maybe v
old, Maybe v
old Maybe v -> Maybe v -> Maybe v
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> v -> Maybe v
forall a. a -> Maybe a
Just v
v)) k
k)
m
none
(\[Char]
t -> [Char]
"duplicate key" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
t [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" after conversion")
([Char]
"the first key" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)
[(Node, Node)]
kvs
Content
_ -> [Char] -> Node -> Parser m
forall a. [Char] -> Node -> Parser a
typeMismatch [Char]
"a mapping" Node
n
where
entry :: (FromYaml k, FromYaml v) => (S.Node, S.Node) -> Parser (k, v)
entry :: forall k v.
(FromYaml k, FromYaml v) =>
(Node, Node) -> Parser (k, v)
entry (Node
k, Node
v) = (,) (k -> v -> (k, v)) -> Parser k -> Parser (v -> (k, v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Node -> Parser k) -> Node -> Parser k
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser k
forall a. FromYaml a => Node -> Parser a
parseYaml Node
k Parser (v -> (k, v)) -> Parser v -> Parser (k, v)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Node, Node) -> Parser v
forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry (Node
k, Node
v)
insertUnique
:: forall a x s c
. Ord c
=> (a -> S.Node)
-> (a -> Parser x)
-> (x -> c)
-> (x -> s -> (Bool, s))
-> s
-> (String -> String)
-> (String -> String)
-> [a]
-> Parser s
insertUnique :: forall a x s c.
Ord c =>
(a -> Node)
-> (a -> Parser x)
-> (x -> c)
-> (x -> s -> (Bool, s))
-> s
-> ([Char] -> [Char])
-> ([Char] -> [Char])
-> [a]
-> Parser s
insertUnique a -> Node
node a -> Parser x
item x -> c
key x -> s -> (Bool, s)
insert s
start [Char] -> [Char]
msg [Char] -> [Char]
note [a]
xs =
(Offset -> Result s) -> Parser s
forall a. (Offset -> Result a) -> Parser a
Parser ((Offset -> Result s) -> Parser s)
-> (Offset -> Result s) -> Parser s
forall a b. (a -> b) -> a -> b
$ \Offset
off -> Offset
-> s -> Errors -> [(c, Node)] -> [Int] -> Int -> [a] -> Result s
go Offset
off s
start Errors
NoErrors [] [] Int
0 [a]
xs
where
go :: S.Offset -> s -> Errors -> [(c, S.Node)] -> [Int] -> Int -> [a] -> Result s
go :: Offset
-> s -> Errors -> [(c, Node)] -> [Int] -> Int -> [a] -> Result s
go Offset
off !s
acc Errors
errs [(c, Node)]
dups [Int]
fails !Int
i = \case
[] -> case (Errors
errs, [(c, Node)]
dups) of
(Errors
NoErrors, []) -> Errors -> s -> Result s
forall a. Errors -> a -> Result a
Result Errors
NoErrors s
acc
(Errors, [(c, Node)])
_ ->
Errors -> s -> Result s
forall a. Errors -> a -> Result a
Result
((Errors -> Errors -> Errors) -> Errors -> [Errors] -> Errors
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
L.foldl' Errors -> Errors -> Errors
bothErrors Errors
errs (((c, Node) -> Errors) -> [(c, Node)] -> [Errors]
forall a b. (a -> b) -> [a] -> [b]
map (Map c Node -> (c, Node) -> Errors
duplicateError (Offset -> [Int] -> Map c Node
firsts Offset
off [Int]
fails)) [(c, Node)]
dups))
s
forall a. a
failed
a
a : [a]
rest ->
let Parser Offset -> Result x
p = a -> Parser x
item a
a
in case Offset -> Result x
p Offset
off of
Result Errors
NoErrors x
x -> case x -> s -> (Bool, s)
insert x
x s
acc of
(Bool
False, s
acc') -> Offset
-> s -> Errors -> [(c, Node)] -> [Int] -> Int -> [a] -> Result s
go Offset
off s
acc' Errors
errs [(c, Node)]
dups [Int]
fails (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [a]
rest
(Bool
True, s
acc') -> Offset
-> s -> Errors -> [(c, Node)] -> [Int] -> Int -> [a] -> Result s
go Offset
off s
acc' Errors
errs ((x -> c
key x
x, a -> Node
node a
a) (c, Node) -> [(c, Node)] -> [(c, Node)]
forall a. a -> [a] -> [a]
: [(c, Node)]
dups) [Int]
fails (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [a]
rest
Result Errors
e x
_ ->
Offset
-> s -> Errors -> [(c, Node)] -> [Int] -> Int -> [a] -> Result s
go Offset
off s
acc (Errors -> Errors -> Errors
bothErrors Errors
errs Errors
e) [(c, Node)]
dups (Int
i Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
: [Int]
fails) (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [a]
rest
duplicateError :: M.Map c S.Node -> (c, S.Node) -> Errors
duplicateError :: Map c Node -> (c, Node) -> Errors
duplicateError Map c Node
fs (c
c, Node
n) =
Offset -> [Char] -> [(Offset, [Char])] -> Errors
OneError
Node
n.offset
([Char] -> [Char]
msg (Node -> [Char]
text Node
n))
[(Node
first.offset, [Char] -> [Char]
note (Node -> [Char]
text Node
first)) | Just Node
first <- [c -> Map c Node -> Maybe Node
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup c
c Map c Node
fs]]
text :: S.Node -> String
text :: Node -> [Char]
text = [Char] -> ([Char] -> [Char]) -> Maybe [Char] -> [Char]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Char]
"" (Char
' ' Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:) (Maybe [Char] -> [Char])
-> (Node -> Maybe [Char]) -> Node -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Node -> Maybe [Char]
inputText
firsts :: S.Offset -> [Int] -> M.Map c S.Node
firsts :: Offset -> [Int] -> Map c Node
firsts Offset
off [Int]
fails =
(Node -> Node -> Node) -> [(c, Node)] -> Map c Node
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
M.fromListWith
(\Node
_ Node
old -> Node
old)
[ (x -> c
key x
x, a -> Node
node a
a)
| (Int
i, a
a) <- [Int] -> [a] -> [(Int, a)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
0 ..] [a]
xs
, Bool -> Bool
not (Int
i Int -> IntSet -> Bool
`IS.member` IntSet
failedSet)
, let Parser Offset -> Result x
p = a -> Parser x
item a
a
, Result Errors
NoErrors x
x <- [Offset -> Result x
p Offset
off]
]
where
failedSet :: IS.IntSet
failedSet :: IntSet
failedSet = [Int] -> IntSet
IS.fromList [Int]
fails
instance FromYaml a => FromYaml (Seq.Seq a) where
parseYaml :: Node -> Parser (Seq a)
parseYaml = ([Node] -> Parser (Seq a)) -> Node -> Parser (Seq a)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([a] -> Seq a) -> Parser [a] -> Parser (Seq a)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [a] -> Seq a
forall a. [a] -> Seq a
Seq.fromList (Parser [a] -> Parser (Seq a))
-> ([Node] -> Parser [a]) -> [Node] -> Parser (Seq a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Node -> Parser a) -> [Node] -> Parser [a]
forall a. (Node -> Parser a) -> [Node] -> Parser [a]
parseItems Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml)
instance FromYaml a => FromYaml (Tree.Tree a) where
parseYaml :: Node -> Parser (Tree a)
parseYaml = ((a, [Tree a]) -> Tree a)
-> Parser (a, [Tree a]) -> Parser (Tree a)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> [Tree a] -> Tree a) -> (a, [Tree a]) -> Tree a
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Tree.Node) (Parser (a, [Tree a]) -> Parser (Tree a))
-> (Node -> Parser (a, [Tree a])) -> Node -> Parser (Tree a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Node -> Parser (a, [Tree a])
forall a. FromYaml a => Node -> Parser a
parseYaml
instance FromYaml Ordering where
parseYaml :: Node -> Parser Ordering
parseYaml = (Text -> Parser Ordering) -> Node -> Parser Ordering
forall a. (Text -> Parser a) -> Node -> Parser a
withText ((Text -> Parser Ordering) -> Node -> Parser Ordering)
-> (Text -> Parser Ordering) -> Node -> Parser Ordering
forall a b. (a -> b) -> a -> b
$ \case
Text
"LT" -> Ordering -> Parser Ordering
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ordering
LT
Text
"EQ" -> Ordering -> Parser Ordering
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ordering
EQ
Text
"GT" -> Ordering -> Parser Ordering
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ordering
GT
Text
_ -> [Char] -> Parser Ordering
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected LT, EQ or GT"
instance FromYaml Void where
parseYaml :: Node -> Parser Void
parseYaml Node
_ = [Char] -> Parser Void
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"the type Void has no values"
instance (Integral a, FromYaml a) => FromYaml (Ratio a) where
parseYaml :: Node -> Parser (Ratio a)
parseYaml = (Object -> Parser (Ratio a)) -> Node -> Parser (Ratio a)
forall a. (Object -> Parser a) -> Node -> Parser a
withMapping ((Object -> Parser (Ratio a)) -> Node -> Parser (Ratio a))
-> (Object -> Parser (Ratio a)) -> Node -> Parser (Ratio a)
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
(n, d) <-
[Text] -> Object -> Parser ()
rejectUnknownKeys [Text
"numerator", Text
"denominator"] Object
o
Parser () -> Parser (a, a) -> Parser (a, a)
forall a b. Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ( (,)
(a -> a -> (a, a)) -> Parser a -> Parser (a -> (a, a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. FromYaml a => Object -> Text -> Parser a
parseField @a Object
o Text
"numerator"
Parser (a -> (a, a)) -> Parser a -> Parser (a, a)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Node -> Parser a) -> Object -> Text -> Parser a
forall a. (Node -> Parser a) -> Object -> Text -> Parser a
parseFieldWith Node -> Parser a
nonZero Object
o Text
"denominator"
)
let r = a -> Integer
forall a. Integral a => a -> Integer
toInteger a
n Integer -> Integer -> Ratio Integer
forall a. Integral a => a -> a -> Ratio a
% a -> Integer
forall a. Integral a => a -> Integer
toInteger a
d
fits :: Integer -> Bool
fits Integer
x = a -> Integer
forall a. Integral a => a -> Integer
toInteger (forall a. Num a => Integer -> a
fromInteger @a Integer
x) Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Integer
x
if fits (numerator r) && fits (denominator r)
then pure (fromInteger (numerator r) :% fromInteger (denominator r))
else fail "the fraction is out of the range of the type"
where
nonZero :: S.Node -> Parser a
nonZero :: Node -> Parser a
nonZero Node
n = do
d <- Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml Node
n
d <$ when (d == 0) (fail "the denominator is 0")
instance HasResolution a => FromYaml (Fixed a) where
parseYaml :: Node -> Parser (Fixed a)
parseYaml = (Scientific -> Parser (Fixed a)) -> Node -> Parser (Fixed a)
forall a. (Scientific -> Parser a) -> Node -> Parser a
withScientific ((Scientific -> Parser (Fixed a)) -> Node -> Parser (Fixed a))
-> (Scientific -> Parser (Fixed a)) -> Node -> Parser (Fixed a)
forall a b. (a -> b) -> a -> b
$ \Scientific
s ->
let scaled :: Scientific
scaled = Scientific
s Scientific -> Scientific -> Scientific
forall a. Num a => a -> a -> a
* Integer -> Scientific
forall a. Num a => Integer -> a
fromInteger Integer
res
in if Scientific -> Bool
Sci.isInteger Scientific
scaled
then Fixed a -> Parser (Fixed a)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> Fixed a
forall k (a :: k). Integer -> Fixed a
MkFixed (Scientific -> Integer
forall b. Integral b => Scientific -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate Scientific
scaled))
else [Char] -> Parser (Fixed a)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser (Fixed a)) -> [Char] -> Parser (Fixed a)
forall a b. (a -> b) -> a -> b
$ [Char]
"expected a multiple of " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
step
where
res :: Integer
res :: Integer
res = Proxy a -> Integer
forall k (a :: k) (p :: k -> *). HasResolution a => p a -> Integer
forall (p :: k -> *). p a -> Integer
resolution (forall (t :: k). Proxy t
forall {k} (t :: k). Proxy t
Proxy @a)
step :: String
step :: [Char]
step = case Integer -> Maybe Int
decimalPlaces Integer
res of
Just Int
places ->
FPFormat -> Maybe Int -> Scientific -> [Char]
Sci.formatScientific
FPFormat
Sci.Fixed
(Int -> Maybe Int
forall a. a -> Maybe a
Just Int
places)
(Integer -> Int -> Scientific
Sci.scientific (Integer
10 Integer -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
places Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` Integer
res) (Int -> Int
forall a. Num a => a -> a
negate Int
places))
Maybe Int
Nothing -> [Char]
"1/" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Integer -> [Char]
forall a. Show a => a -> [Char]
show Integer
res
deriving newtype instance FromYaml a => FromYaml (Identity a)
deriving newtype instance FromYaml a => FromYaml (Const a b)
deriving newtype instance FromYaml a => FromYaml (Down a)
deriving newtype instance FromYaml a => FromYaml (Sem.Min a)
deriving newtype instance FromYaml a => FromYaml (Sem.Max a)
deriving newtype instance FromYaml a => FromYaml (Sem.First a)
deriving newtype instance FromYaml a => FromYaml (Sem.Last a)
deriving newtype instance FromYaml a => FromYaml (Mon.First a)
deriving newtype instance FromYaml a => FromYaml (Mon.Last a)
deriving newtype instance FromYaml a => FromYaml (Sem.Dual a)
deriving newtype instance FromYaml a => FromYaml (Sem.Sum a)
deriving newtype instance FromYaml a => FromYaml (Sem.Product a)
deriving newtype instance FromYaml Sem.All
deriving newtype instance FromYaml Sem.Any
instance (FromYaml a, FromYaml b) => FromYaml (Either a b) where
parseYaml :: Node -> Parser (Either a b)
parseYaml = (Object -> Parser (Either a b)) -> Node -> Parser (Either a b)
forall a. (Object -> Parser a) -> Node -> Parser a
withMapping ((Object -> Parser (Either a b)) -> Node -> Parser (Either a b))
-> (Object -> Parser (Either a b)) -> Node -> Parser (Either a b)
forall a b. (a -> b) -> a -> b
$ \Object
o -> case Object -> [(Node, Node)]
objectEntries Object
o of
[(Node
k, Node
v)] -> case Node -> Maybe Text
stringValue Node
k of
Just Text
"Left" -> a -> Either a b
forall a b. a -> Either a b
Left (a -> Either a b) -> Parser a -> Parser (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Node, Node) -> Parser a
forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry (Node
k, Node
v)
Just Text
"Right" -> b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b) -> Parser b -> Parser (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Node, Node) -> Parser b
forall a. FromYaml a => (Node, Node) -> Parser a
parseEntry (Node
k, Node
v)
Maybe Text
_ -> Node -> [Char] -> Parser (Either a b)
forall a. Node -> [Char] -> Parser a
failAt Node
k [Char]
"expected the key Left or Right"
[(Node, Node)]
_ -> [Char] -> Parser (Either a b)
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail [Char]
"expected a mapping with one key, Left or Right"
instance (FromYaml a1, FromYaml a2) => FromYaml (a1, a2) where
parseYaml :: Node -> Parser (a1, a2)
parseYaml = ([Node] -> Parser (a1, a2)) -> Node -> Parser (a1, a2)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2)) -> Node -> Parser (a1, a2))
-> ([Node] -> Parser (a1, a2)) -> Node -> Parser (a1, a2)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2] -> (,) (a1 -> a2 -> (a1, a2)) -> Parser a1 -> Parser (a2 -> (a1, a2))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1 Parser (a2 -> (a1, a2)) -> Parser a2 -> Parser (a1, a2)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2
[Node]
xs -> Int -> [Node] -> Parser (a1, a2)
forall a. Int -> [Node] -> Parser a
tupleSize Int
2 [Node]
xs
instance (FromYaml a1, FromYaml a2, FromYaml a3) => FromYaml (a1, a2, a3) where
parseYaml :: Node -> Parser (a1, a2, a3)
parseYaml = ([Node] -> Parser (a1, a2, a3)) -> Node -> Parser (a1, a2, a3)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3)) -> Node -> Parser (a1, a2, a3))
-> ([Node] -> Parser (a1, a2, a3)) -> Node -> Parser (a1, a2, a3)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3] -> (,,) (a1 -> a2 -> a3 -> (a1, a2, a3))
-> Parser a1 -> Parser (a2 -> a3 -> (a1, a2, a3))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1 Parser (a2 -> a3 -> (a1, a2, a3))
-> Parser a2 -> Parser (a3 -> (a1, a2, a3))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2 Parser (a3 -> (a1, a2, a3)) -> Parser a3 -> Parser (a1, a2, a3)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3)
forall a. Int -> [Node] -> Parser a
tupleSize Int
3 [Node]
xs
instance
(FromYaml a1, FromYaml a2, FromYaml a3, FromYaml a4)
=> FromYaml (a1, a2, a3, a4)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4))
-> Node -> Parser (a1, a2, a3, a4)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4))
-> Node -> Parser (a1, a2, a3, a4))
-> ([Node] -> Parser (a1, a2, a3, a4))
-> Node
-> Parser (a1, a2, a3, a4)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4] -> (,,,) (a1 -> a2 -> a3 -> a4 -> (a1, a2, a3, a4))
-> Parser a1 -> Parser (a2 -> a3 -> a4 -> (a1, a2, a3, a4))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1 Parser (a2 -> a3 -> a4 -> (a1, a2, a3, a4))
-> Parser a2 -> Parser (a3 -> a4 -> (a1, a2, a3, a4))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2 Parser (a3 -> a4 -> (a1, a2, a3, a4))
-> Parser a3 -> Parser (a4 -> (a1, a2, a3, a4))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3 Parser (a4 -> (a1, a2, a3, a4))
-> Parser a4 -> Parser (a1, a2, a3, a4)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4)
forall a. Int -> [Node] -> Parser a
tupleSize Int
4 [Node]
xs
instance
(FromYaml a1, FromYaml a2, FromYaml a3, FromYaml a4, FromYaml a5)
=> FromYaml (a1, a2, a3, a4, a5)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4, a5)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4, a5))
-> Node -> Parser (a1, a2, a3, a4, a5)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4, a5))
-> Node -> Parser (a1, a2, a3, a4, a5))
-> ([Node] -> Parser (a1, a2, a3, a4, a5))
-> Node
-> Parser (a1, a2, a3, a4, a5)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4, Node
a5] ->
(,,,,) (a1 -> a2 -> a3 -> a4 -> a5 -> (a1, a2, a3, a4, a5))
-> Parser a1
-> Parser (a2 -> a3 -> a4 -> a5 -> (a1, a2, a3, a4, a5))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1 Parser (a2 -> a3 -> a4 -> a5 -> (a1, a2, a3, a4, a5))
-> Parser a2 -> Parser (a3 -> a4 -> a5 -> (a1, a2, a3, a4, a5))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2 Parser (a3 -> a4 -> a5 -> (a1, a2, a3, a4, a5))
-> Parser a3 -> Parser (a4 -> a5 -> (a1, a2, a3, a4, a5))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3 Parser (a4 -> a5 -> (a1, a2, a3, a4, a5))
-> Parser a4 -> Parser (a5 -> (a1, a2, a3, a4, a5))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4 Parser (a5 -> (a1, a2, a3, a4, a5))
-> Parser a5 -> Parser (a1, a2, a3, a4, a5)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a5
forall a. FromYaml a => Node -> Parser a
element Node
a5
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4, a5)
forall a. Int -> [Node] -> Parser a
tupleSize Int
5 [Node]
xs
instance
(FromYaml a1, FromYaml a2, FromYaml a3, FromYaml a4, FromYaml a5, FromYaml a6)
=> FromYaml (a1, a2, a3, a4, a5, a6)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4, a5, a6)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4, a5, a6))
-> Node -> Parser (a1, a2, a3, a4, a5, a6)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4, a5, a6))
-> Node -> Parser (a1, a2, a3, a4, a5, a6))
-> ([Node] -> Parser (a1, a2, a3, a4, a5, a6))
-> Node
-> Parser (a1, a2, a3, a4, a5, a6)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4, Node
a5, Node
a6] ->
(,,,,,)
(a1 -> a2 -> a3 -> a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
-> Parser a1
-> Parser (a2 -> a3 -> a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1
Parser (a2 -> a3 -> a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
-> Parser a2
-> Parser (a3 -> a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2
Parser (a3 -> a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
-> Parser a3 -> Parser (a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3
Parser (a4 -> a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
-> Parser a4 -> Parser (a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4
Parser (a5 -> a6 -> (a1, a2, a3, a4, a5, a6))
-> Parser a5 -> Parser (a6 -> (a1, a2, a3, a4, a5, a6))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a5
forall a. FromYaml a => Node -> Parser a
element Node
a5
Parser (a6 -> (a1, a2, a3, a4, a5, a6))
-> Parser a6 -> Parser (a1, a2, a3, a4, a5, a6)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a6
forall a. FromYaml a => Node -> Parser a
element Node
a6
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4, a5, a6)
forall a. Int -> [Node] -> Parser a
tupleSize Int
6 [Node]
xs
instance
( FromYaml a1
, FromYaml a2
, FromYaml a3
, FromYaml a4
, FromYaml a5
, FromYaml a6
, FromYaml a7
)
=> FromYaml (a1, a2, a3, a4, a5, a6, a7)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4, a5, a6, a7)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7))
-> ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7))
-> Node
-> Parser (a1, a2, a3, a4, a5, a6, a7)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4, Node
a5, Node
a6, Node
a7] ->
(,,,,,,)
(a1
-> a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a1
-> Parser
(a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1
Parser
(a2 -> a3 -> a4 -> a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a2
-> Parser
(a3 -> a4 -> a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2
Parser (a3 -> a4 -> a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a3
-> Parser (a4 -> a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3
Parser (a4 -> a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a4
-> Parser (a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4
Parser (a5 -> a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a5 -> Parser (a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a5
forall a. FromYaml a => Node -> Parser a
element Node
a5
Parser (a6 -> a7 -> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a6 -> Parser (a7 -> (a1, a2, a3, a4, a5, a6, a7))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a6
forall a. FromYaml a => Node -> Parser a
element Node
a6
Parser (a7 -> (a1, a2, a3, a4, a5, a6, a7))
-> Parser a7 -> Parser (a1, a2, a3, a4, a5, a6, a7)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a7
forall a. FromYaml a => Node -> Parser a
element Node
a7
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4, a5, a6, a7)
forall a. Int -> [Node] -> Parser a
tupleSize Int
7 [Node]
xs
instance
( FromYaml a1
, FromYaml a2
, FromYaml a3
, FromYaml a4
, FromYaml a5
, FromYaml a6
, FromYaml a7
, FromYaml a8
)
=> FromYaml (a1, a2, a3, a4, a5, a6, a7, a8)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8))
-> ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8))
-> Node
-> Parser (a1, a2, a3, a4, a5, a6, a7, a8)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4, Node
a5, Node
a6, Node
a7, Node
a8] ->
(,,,,,,,)
(a1
-> a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a1
-> Parser
(a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> (a1, a2, a3, a4, a5, a6, a7, a8))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1
Parser
(a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a2
-> Parser
(a3
-> a4 -> a5 -> a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2
Parser
(a3
-> a4 -> a5 -> a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a3
-> Parser
(a4 -> a5 -> a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3
Parser
(a4 -> a5 -> a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a4
-> Parser
(a5 -> a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4
Parser (a5 -> a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a5
-> Parser (a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a5
forall a. FromYaml a => Node -> Parser a
element Node
a5
Parser (a6 -> a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a6
-> Parser (a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a6
forall a. FromYaml a => Node -> Parser a
element Node
a6
Parser (a7 -> a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a7 -> Parser (a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a7
forall a. FromYaml a => Node -> Parser a
element Node
a7
Parser (a8 -> (a1, a2, a3, a4, a5, a6, a7, a8))
-> Parser a8 -> Parser (a1, a2, a3, a4, a5, a6, a7, a8)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a8
forall a. FromYaml a => Node -> Parser a
element Node
a8
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8)
forall a. Int -> [Node] -> Parser a
tupleSize Int
8 [Node]
xs
instance
( FromYaml a1
, FromYaml a2
, FromYaml a3
, FromYaml a4
, FromYaml a5
, FromYaml a6
, FromYaml a7
, FromYaml a8
, FromYaml a9
)
=> FromYaml (a1, a2, a3, a4, a5, a6, a7, a8, a9)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Node
-> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4, Node
a5, Node
a6, Node
a7, Node
a8, Node
a9] ->
(,,,,,,,,)
(a1
-> a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a1
-> Parser
(a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1
Parser
(a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a2
-> Parser
(a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2
Parser
(a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a3
-> Parser
(a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3
Parser
(a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a4
-> Parser
(a5
-> a6 -> a7 -> a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4
Parser
(a5
-> a6 -> a7 -> a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a5
-> Parser
(a6 -> a7 -> a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a5
forall a. FromYaml a => Node -> Parser a
element Node
a5
Parser
(a6 -> a7 -> a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a6
-> Parser (a7 -> a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a6
forall a. FromYaml a => Node -> Parser a
element Node
a6
Parser (a7 -> a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a7
-> Parser (a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a7
forall a. FromYaml a => Node -> Parser a
element Node
a7
Parser (a8 -> a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a8 -> Parser (a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a8
forall a. FromYaml a => Node -> Parser a
element Node
a8
Parser (a9 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9))
-> Parser a9 -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a9
forall a. FromYaml a => Node -> Parser a
element Node
a9
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9)
forall a. Int -> [Node] -> Parser a
tupleSize Int
9 [Node]
xs
instance
( FromYaml a1
, FromYaml a2
, FromYaml a3
, FromYaml a4
, FromYaml a5
, FromYaml a6
, FromYaml a7
, FromYaml a8
, FromYaml a9
, FromYaml a10
)
=> FromYaml (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
where
parseYaml :: Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
parseYaml = ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
forall a. ([Node] -> Parser a) -> Node -> Parser a
withSequence (([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Node -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> ([Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Node
-> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
forall a b. (a -> b) -> a -> b
$ \case
[Node
a1, Node
a2, Node
a3, Node
a4, Node
a5, Node
a6, Node
a7, Node
a8, Node
a9, Node
a10] ->
(,,,,,,,,,)
(a1
-> a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a1
-> Parser
(a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Node -> Parser a1
forall a. FromYaml a => Node -> Parser a
element Node
a1
Parser
(a2
-> a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a2
-> Parser
(a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a2
forall a. FromYaml a => Node -> Parser a
element Node
a2
Parser
(a3
-> a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a3
-> Parser
(a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a3
forall a. FromYaml a => Node -> Parser a
element Node
a3
Parser
(a4
-> a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a4
-> Parser
(a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a4
forall a. FromYaml a => Node -> Parser a
element Node
a4
Parser
(a5
-> a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a5
-> Parser
(a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a5
forall a. FromYaml a => Node -> Parser a
element Node
a5
Parser
(a6
-> a7
-> a8
-> a9
-> a10
-> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a6
-> Parser
(a7
-> a8 -> a9 -> a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a6
forall a. FromYaml a => Node -> Parser a
element Node
a6
Parser
(a7
-> a8 -> a9 -> a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a7
-> Parser
(a8 -> a9 -> a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a7
forall a. FromYaml a => Node -> Parser a
element Node
a7
Parser
(a8 -> a9 -> a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a8
-> Parser (a9 -> a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a8
forall a. FromYaml a => Node -> Parser a
element Node
a8
Parser (a9 -> a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a9
-> Parser (a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a9
forall a. FromYaml a => Node -> Parser a
element Node
a9
Parser (a10 -> (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-> Parser a10 -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Node -> Parser a10
forall a. FromYaml a => Node -> Parser a
element Node
a10
[Node]
xs -> Int -> [Node] -> Parser (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
forall a. Int -> [Node] -> Parser a
tupleSize Int
10 [Node]
xs
element :: FromYaml a => S.Node -> Parser a
element :: forall a. FromYaml a => Node -> Parser a
element = (Node -> Parser a) -> Node -> Parser a
forall a. (Node -> Parser a) -> Node -> Parser a
parseNode Node -> Parser a
forall a. FromYaml a => Node -> Parser a
parseYaml
tupleSize :: Int -> [S.Node] -> Parser a
tupleSize :: forall a. Int -> [Node] -> Parser a
tupleSize Int
n [Node]
xs =
[Char] -> Parser a
forall a. [Char] -> Parser a
forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char] -> Parser a) -> [Char] -> Parser a
forall a b. (a -> b) -> a -> b
$ [Char]
"expected a list of " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
n [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" elements, but got " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> [Char]
forall a. Show a => a -> [Char]
show ([Node] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Node]
xs)