{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeApplications #-}
module Autodocodec.Codec where
import Control.Monad.State
import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey)
import qualified Data.Aeson as JSON
#if MIN_VERSION_aeson(2,0,0)
import Data.Aeson.KeyMap (KeyMap)
import qualified Data.Aeson.KeyMap as KM
#endif
import qualified Data.Aeson.Types as JSON
import Data.HashMap.Strict (HashMap)
import Data.Hashable
import Data.List.NonEmpty (NonEmpty (..))
import qualified Data.List.NonEmpty as NE
import Data.Map (Map)
import Data.Scientific as Scientific
import Data.Set (Set)
import qualified Data.Set as S
import Data.Text (Text)
import qualified Data.Text as T
import Data.Validity
import Data.Validity.Scientific ()
import Data.Vector (Vector)
import qualified Data.Vector as V
import GHC.Generics (Generic)
data Codec context input output where
NullCodec ::
ValueCodec () ()
BoolCodec ::
Maybe Text ->
JSONCodec Bool
StringCodec ::
Maybe Text ->
JSONCodec Text
NumberCodec ::
Maybe Text ->
Maybe NumberBounds ->
JSONCodec Scientific
HashMapCodec ::
(Eq k, Hashable k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v ->
JSONCodec (HashMap k v)
MapCodec ::
(Ord k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v ->
JSONCodec (Map k v)
ValueCodec ::
JSONCodec JSON.Value
ArrayOfCodec ::
Maybe Text ->
ValueCodec input output ->
ValueCodec (Vector input) (Vector output)
ObjectOfCodec ::
Maybe Text ->
ObjectCodec input output ->
ValueCodec input output
EqCodec ::
(Show value, Eq value) =>
value ->
JSONCodec value ->
JSONCodec value
BimapCodec ::
(oldOutput -> Either String newOutput) ->
(newInput -> oldInput) ->
Codec context oldInput oldOutput ->
Codec context newInput newOutput
EitherCodec ::
!Union ->
Codec context input1 output1 ->
Codec context input2 output2 ->
Codec context (Either input1 input2) (Either output1 output2)
::
Text ->
ValueCodec input output ->
ValueCodec input output
ReferenceCodec ::
Text ->
~(ValueCodec input output) ->
ValueCodec input output
RequiredKeyCodec ::
Text ->
ValueCodec input output ->
Maybe Text ->
ObjectCodec input output
OptionalKeyCodec ::
Text ->
ValueCodec input output ->
Maybe Text ->
ObjectCodec (Maybe input) (Maybe output)
OptionalKeyWithDefaultCodec ::
Text ->
ValueCodec value value ->
value ->
Maybe Text ->
ObjectCodec value value
OptionalKeyWithOmittedDefaultCodec ::
Eq value =>
Text ->
ValueCodec value value ->
value ->
Maybe Text ->
ObjectCodec value value
PureCodec ::
output ->
ObjectCodec void output
ApCodec ::
ObjectCodec input (output -> newOutput) ->
ObjectCodec input output ->
ObjectCodec input newOutput
data NumberBounds = NumberBounds
{ NumberBounds -> Scientific
numberBoundsLower :: !Scientific,
NumberBounds -> Scientific
numberBoundsUpper :: !Scientific
}
deriving (Int -> NumberBounds -> ShowS
[NumberBounds] -> ShowS
NumberBounds -> String
(Int -> NumberBounds -> ShowS)
-> (NumberBounds -> String)
-> ([NumberBounds] -> ShowS)
-> Show NumberBounds
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NumberBounds] -> ShowS
$cshowList :: [NumberBounds] -> ShowS
show :: NumberBounds -> String
$cshow :: NumberBounds -> String
showsPrec :: Int -> NumberBounds -> ShowS
$cshowsPrec :: Int -> NumberBounds -> ShowS
Show, NumberBounds -> NumberBounds -> Bool
(NumberBounds -> NumberBounds -> Bool)
-> (NumberBounds -> NumberBounds -> Bool) -> Eq NumberBounds
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: NumberBounds -> NumberBounds -> Bool
$c/= :: NumberBounds -> NumberBounds -> Bool
== :: NumberBounds -> NumberBounds -> Bool
$c== :: NumberBounds -> NumberBounds -> Bool
Eq, (forall x. NumberBounds -> Rep NumberBounds x)
-> (forall x. Rep NumberBounds x -> NumberBounds)
-> Generic NumberBounds
forall x. Rep NumberBounds x -> NumberBounds
forall x. NumberBounds -> Rep NumberBounds x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep NumberBounds x -> NumberBounds
$cfrom :: forall x. NumberBounds -> Rep NumberBounds x
Generic)
instance Validity NumberBounds
checkNumberBounds :: NumberBounds -> Scientific -> Either String Scientific
checkNumberBounds :: NumberBounds -> Scientific -> Either String Scientific
checkNumberBounds NumberBounds {Scientific
numberBoundsUpper :: Scientific
numberBoundsLower :: Scientific
numberBoundsUpper :: NumberBounds -> Scientific
numberBoundsLower :: NumberBounds -> Scientific
..} Scientific
s =
if Scientific
numberBoundsLower Scientific -> Scientific -> Bool
forall a. Ord a => a -> a -> Bool
<= Scientific
s
then
if Scientific
s Scientific -> Scientific -> Bool
forall a. Ord a => a -> a -> Bool
<= Scientific
numberBoundsUpper
then Scientific -> Either String Scientific
forall a b. b -> Either a b
Right Scientific
s
else String -> Either String Scientific
forall a b. a -> Either a b
Left (String -> Either String Scientific)
-> String -> Either String Scientific
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords [String
"Number", Scientific -> String
forall a. Show a => a -> String
show Scientific
s, String
"is bigger than the upper bound", Scientific -> String
forall a. Show a => a -> String
show Scientific
numberBoundsUpper]
else String -> Either String Scientific
forall a b. a -> Either a b
Left (String -> Either String Scientific)
-> String -> Either String Scientific
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords [String
"Number", Scientific -> String
forall a. Show a => a -> String
show Scientific
s, String
"is smaller than the lower bound", Scientific -> String
forall a. Show a => a -> String
show Scientific
numberBoundsUpper]
data Union
=
PossiblyJointUnion
|
DisjointUnion
deriving (Int -> Union -> ShowS
[Union] -> ShowS
Union -> String
(Int -> Union -> ShowS)
-> (Union -> String) -> ([Union] -> ShowS) -> Show Union
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Union] -> ShowS
$cshowList :: [Union] -> ShowS
show :: Union -> String
$cshow :: Union -> String
showsPrec :: Int -> Union -> ShowS
$cshowsPrec :: Int -> Union -> ShowS
Show, Union -> Union -> Bool
(Union -> Union -> Bool) -> (Union -> Union -> Bool) -> Eq Union
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Union -> Union -> Bool
$c/= :: Union -> Union -> Bool
== :: Union -> Union -> Bool
$c== :: Union -> Union -> Bool
Eq, (forall x. Union -> Rep Union x)
-> (forall x. Rep Union x -> Union) -> Generic Union
forall x. Rep Union x -> Union
forall x. Union -> Rep Union x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Union x -> Union
$cfrom :: forall x. Union -> Rep Union x
Generic)
instance Validity Union
type ValueCodec = Codec JSON.Value
type ObjectCodec = Codec JSON.Object
type JSONCodec a = ValueCodec a a
type JSONObjectCodec a = ObjectCodec a a
showCodecABit :: Codec context input output -> String
showCodecABit :: Codec context input output -> String
showCodecABit = (ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
"") (ShowS -> String)
-> (Codec context input output -> ShowS)
-> Codec context input output
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (State (Set Text) ShowS -> Set Text -> ShowS
forall s a. State s a -> s -> a
`evalState` Set Text
forall a. Set a
S.empty) (State (Set Text) ShowS -> ShowS)
-> (Codec context input output -> State (Set Text) ShowS)
-> Codec context input output
-> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Codec context input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
0
where
go :: Int -> Codec context input output -> State (Set Text) ShowS
go :: Int -> Codec context input output -> State (Set Text) ShowS
go Int
d = \case
Codec context input output
NullCodec -> ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"NullCodec"
BoolCodec Maybe Text
mName -> ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"BoolCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mName
StringCodec Maybe Text
mName -> ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"StringCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mName
NumberCodec Maybe Text
mName Maybe NumberBounds
mbs -> ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"NumberCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mName ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe NumberBounds -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe NumberBounds
mbs
ArrayOfCodec Maybe Text
mName ValueCodec input output
c -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"ArrayOfCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mName ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ValueCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ValueCodec input output
c
ObjectOfCodec Maybe Text
mName ObjectCodec input output
oc -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"ObjectOfCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mName ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ObjectCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ObjectCodec input output
oc
Codec context input output
ValueCodec -> ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"ValueCodec"
MapCodec JSONCodec v
c -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"MapCodec" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> JSONCodec v -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 JSONCodec v
c
HashMapCodec JSONCodec v
c -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"HashMapCodec" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> JSONCodec v -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 JSONCodec v
c
#if MIN_VERSION_aeson(2,0,0)
#endif
EqCodec input
value JSONCodec input
c -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"EqCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> input -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 input
value ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> JSONCodec input -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 JSONCodec input
c
BimapCodec oldOutput -> Either String output
_ input -> oldInput
_ Codec context oldInput oldOutput
c -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"BimapCodec _ _ " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Codec context oldInput oldOutput -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 Codec context oldInput oldOutput
c
EitherCodec Union
u Codec context input1 output1
c1 Codec context input2 output2
c2 -> (\ShowS
s1 ShowS
s2 -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"EitherCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Union -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Union
u ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s1 ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s2) (ShowS -> ShowS -> ShowS)
-> State (Set Text) ShowS
-> StateT (Set Text) Identity (ShowS -> ShowS)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Codec context input1 output1 -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 Codec context input1 output1
c1 StateT (Set Text) Identity (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> Codec context input2 output2 -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 Codec context input2 output2
c2
CommentCodec Text
comment ValueCodec input output
c -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"CommentCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
comment ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ValueCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ValueCodec input output
c
ReferenceCodec Text
name ValueCodec input output
c -> do
Bool
alreadySeen <- (Set Text -> Bool) -> StateT (Set Text) Identity Bool
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets (Text -> Set Text -> Bool
forall a. Ord a => a -> Set a -> Bool
S.member Text
name)
if Bool
alreadySeen
then ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"ReferenceCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
name
else do
(Set Text -> Set Text) -> StateT (Set Text) Identity ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify (Text -> Set Text -> Set Text
forall a. Ord a => a -> Set a -> Set a
S.insert Text
name)
ShowS
s <- Int -> ValueCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ValueCodec input output
c
ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"ReferenceCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
name ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s
RequiredKeyCodec Text
k ValueCodec input output
c Maybe Text
mdoc -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"RequiredKeyCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
k ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mdoc ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ValueCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ValueCodec input output
c
OptionalKeyCodec Text
k ValueCodec input output
c Maybe Text
mdoc -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"OptionalKeyCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
k ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mdoc ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> ValueCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ValueCodec input output
c
OptionalKeyWithDefaultCodec Text
k JSONCodec input
c input
_ Maybe Text
mdoc -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"OptionalKeyWithDefaultCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
k ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" _ " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mdoc) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> JSONCodec input -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 JSONCodec input
c
OptionalKeyWithOmittedDefaultCodec Text
k JSONCodec input
c input
_ Maybe Text
mdoc -> (\ShowS
s -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"OptionalKeyWithOmittedDefaultCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Text
k ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" _ " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Text -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11 Maybe Text
mdoc) (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> JSONCodec input -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 JSONCodec input
c
PureCodec output
_ -> ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShowS -> State (Set Text) ShowS)
-> ShowS -> State (Set Text) ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"PureCodec _"
ApCodec ObjectCodec input (output -> output)
oc1 ObjectCodec input output
oc2 -> (\ShowS
s1 ShowS
s2 -> Bool -> ShowS -> ShowS
showParen (Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
10) (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString String
"ApCodec " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s1 ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
" " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
s2) (ShowS -> ShowS -> ShowS)
-> State (Set Text) ShowS
-> StateT (Set Text) Identity (ShowS -> ShowS)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int
-> ObjectCodec input (output -> output) -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ObjectCodec input (output -> output)
oc1 StateT (Set Text) Identity (ShowS -> ShowS)
-> State (Set Text) ShowS -> State (Set Text) ShowS
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> ObjectCodec input output -> State (Set Text) ShowS
forall context input output.
Int -> Codec context input output -> State (Set Text) ShowS
go Int
11 ObjectCodec input output
oc2
rmapCodec ::
(oldOutput -> newOutput) ->
Codec context input oldOutput ->
Codec context input newOutput
rmapCodec :: (oldOutput -> newOutput)
-> Codec context input oldOutput -> Codec context input newOutput
rmapCodec oldOutput -> newOutput
f = (oldOutput -> newOutput)
-> (input -> input)
-> Codec context input oldOutput
-> Codec context input newOutput
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec oldOutput -> newOutput
f input -> input
forall a. a -> a
id
instance Functor (Codec context input) where
fmap :: (a -> b) -> Codec context input a -> Codec context input b
fmap = (a -> b) -> Codec context input a -> Codec context input b
forall oldOutput newOutput context input.
(oldOutput -> newOutput)
-> Codec context input oldOutput -> Codec context input newOutput
rmapCodec
lmapCodec ::
(newInput -> oldInput) ->
Codec context oldInput output ->
Codec context newInput output
lmapCodec :: (newInput -> oldInput)
-> Codec context oldInput output -> Codec context newInput output
lmapCodec newInput -> oldInput
g = (output -> output)
-> (newInput -> oldInput)
-> Codec context oldInput output
-> Codec context newInput output
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec output -> output
forall a. a -> a
id newInput -> oldInput
g
(.=) :: ObjectCodec oldInput output -> (newInput -> oldInput) -> ObjectCodec newInput output
.= :: ObjectCodec oldInput output
-> (newInput -> oldInput) -> ObjectCodec newInput output
(.=) = ((newInput -> oldInput)
-> ObjectCodec oldInput output -> ObjectCodec newInput output)
-> ObjectCodec oldInput output
-> (newInput -> oldInput)
-> ObjectCodec newInput output
forall a b c. (a -> b -> c) -> b -> a -> c
flip (newInput -> oldInput)
-> ObjectCodec oldInput output -> ObjectCodec newInput output
forall newInput oldInput context output.
(newInput -> oldInput)
-> Codec context oldInput output -> Codec context newInput output
lmapCodec
dimapCodec ::
(oldOutput -> newOutput) ->
(newInput -> oldInput) ->
Codec context oldInput oldOutput ->
Codec context newInput newOutput
dimapCodec :: (oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec oldOutput -> newOutput
f newInput -> oldInput
g = (oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
bimapCodec (newOutput -> Either String newOutput
forall a b. b -> Either a b
Right (newOutput -> Either String newOutput)
-> (oldOutput -> newOutput) -> oldOutput -> Either String newOutput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. oldOutput -> newOutput
f) newInput -> oldInput
g
pureCodec :: output -> ObjectCodec input output
pureCodec :: output -> ObjectCodec input output
pureCodec = output -> ObjectCodec input output
forall output void. output -> ObjectCodec void output
PureCodec
apCodec :: ObjectCodec input (output -> newOutput) -> ObjectCodec input output -> ObjectCodec input newOutput
apCodec :: ObjectCodec input (output -> newOutput)
-> ObjectCodec input output -> ObjectCodec input newOutput
apCodec = ObjectCodec input (output -> newOutput)
-> ObjectCodec input output -> ObjectCodec input newOutput
forall input output newOutput.
ObjectCodec input (output -> newOutput)
-> ObjectCodec input output -> ObjectCodec input newOutput
ApCodec
instance Applicative (ObjectCodec input) where
pure :: a -> ObjectCodec input a
pure = a -> ObjectCodec input a
forall output void. output -> ObjectCodec void output
pureCodec
<*> :: ObjectCodec input (a -> b)
-> ObjectCodec input a -> ObjectCodec input b
(<*>) = ObjectCodec input (a -> b)
-> ObjectCodec input a -> ObjectCodec input b
forall input output newOutput.
ObjectCodec input (output -> newOutput)
-> ObjectCodec input output -> ObjectCodec input newOutput
apCodec
maybeCodec :: ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
maybeCodec :: ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
maybeCodec =
(Either () output -> Maybe output)
-> (Maybe input -> Either () input)
-> Codec Value (Either () input) (Either () output)
-> ValueCodec (Maybe input) (Maybe output)
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Either () output -> Maybe output
forall a. Either () a -> Maybe a
f Maybe input -> Either () input
forall b. Maybe b -> Either () b
g
(Codec Value (Either () input) (Either () output)
-> ValueCodec (Maybe input) (Maybe output))
-> (ValueCodec input output
-> Codec Value (Either () input) (Either () output))
-> ValueCodec input output
-> ValueCodec (Maybe input) (Maybe output)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Codec Value () ()
-> ValueCodec input output
-> Codec Value (Either () input) (Either () output)
forall context input1 output1 input2 output2.
Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
possiblyJointEitherCodec Codec Value () ()
nullCodec
where
f :: Either () a -> Maybe a
f = \case
Left () -> Maybe a
forall a. Maybe a
Nothing
Right a
r -> a -> Maybe a
forall a. a -> Maybe a
Just a
r
g :: Maybe b -> Either () b
g = \case
Maybe b
Nothing -> () -> Either () b
forall a b. a -> Either a b
Left ()
Just b
r -> b -> Either () b
forall a b. b -> Either a b
Right b
r
eitherCodec ::
Codec context input1 output1 ->
Codec context input2 output2 ->
Codec context (Either input1 input2) (Either output1 output2)
eitherCodec :: Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
eitherCodec = Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
forall context input1 output1 input2 output2.
Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
possiblyJointEitherCodec
possiblyJointEitherCodec ::
Codec context input1 output1 ->
Codec context input2 output2 ->
Codec context (Either input1 input2) (Either output1 output2)
possiblyJointEitherCodec :: Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
possiblyJointEitherCodec = Union
-> Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
forall context input1 output1 input2 output2.
Union
-> Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
EitherCodec Union
PossiblyJointUnion
disjointEitherCodec ::
Codec context input1 output1 ->
Codec context input2 output2 ->
Codec context (Either input1 input2) (Either output1 output2)
disjointEitherCodec :: Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
disjointEitherCodec = Union
-> Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
forall context input1 output1 input2 output2.
Union
-> Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
EitherCodec Union
DisjointUnion
bimapCodec ::
(oldOutput -> Either String newOutput) ->
(newInput -> oldInput) ->
Codec context oldInput oldOutput ->
Codec context newInput newOutput
bimapCodec :: (oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
bimapCodec oldOutput -> Either String newOutput
f newInput -> oldInput
g = \case
BimapCodec oldOutput -> Either String oldOutput
f' oldInput -> oldInput
g' Codec context oldInput oldOutput
c -> (oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
BimapCodec (oldOutput -> Either String oldOutput
f' (oldOutput -> Either String oldOutput)
-> (oldOutput -> Either String newOutput)
-> oldOutput
-> Either String newOutput
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> oldOutput -> Either String newOutput
f) (oldInput -> oldInput
g' (oldInput -> oldInput)
-> (newInput -> oldInput) -> newInput -> oldInput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. newInput -> oldInput
g) Codec context oldInput oldOutput
c
Codec context oldInput oldOutput
c -> (oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
BimapCodec oldOutput -> Either String newOutput
f newInput -> oldInput
g Codec context oldInput oldOutput
c
vectorCodec :: ValueCodec input output -> ValueCodec (Vector input) (Vector output)
vectorCodec :: ValueCodec input output
-> ValueCodec (Vector input) (Vector output)
vectorCodec = Maybe Text
-> ValueCodec input output
-> ValueCodec (Vector input) (Vector output)
forall v output.
Maybe Text
-> ValueCodec v output -> ValueCodec (Vector v) (Vector output)
ArrayOfCodec Maybe Text
forall a. Maybe a
Nothing
listCodec :: ValueCodec input output -> ValueCodec [input] [output]
listCodec :: ValueCodec input output -> ValueCodec [input] [output]
listCodec = (Vector output -> [output])
-> ([input] -> Vector input)
-> Codec Value (Vector input) (Vector output)
-> ValueCodec [input] [output]
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Vector output -> [output]
forall a. Vector a -> [a]
V.toList [input] -> Vector input
forall a. [a] -> Vector a
V.fromList (Codec Value (Vector input) (Vector output)
-> ValueCodec [input] [output])
-> (ValueCodec input output
-> Codec Value (Vector input) (Vector output))
-> ValueCodec input output
-> ValueCodec [input] [output]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ValueCodec input output
-> Codec Value (Vector input) (Vector output)
forall input output.
ValueCodec input output
-> ValueCodec (Vector input) (Vector output)
vectorCodec
nonEmptyCodec :: ValueCodec input output -> ValueCodec (NonEmpty input) (NonEmpty output)
nonEmptyCodec :: ValueCodec input output
-> ValueCodec (NonEmpty input) (NonEmpty output)
nonEmptyCodec = ([output] -> Either String (NonEmpty output))
-> (NonEmpty input -> [input])
-> Codec Value [input] [output]
-> ValueCodec (NonEmpty input) (NonEmpty output)
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
bimapCodec [output] -> Either String (NonEmpty output)
forall a. [a] -> Either String (NonEmpty a)
parseNonEmptyList NonEmpty input -> [input]
forall a. NonEmpty a -> [a]
NE.toList (Codec Value [input] [output]
-> ValueCodec (NonEmpty input) (NonEmpty output))
-> (ValueCodec input output -> Codec Value [input] [output])
-> ValueCodec input output
-> ValueCodec (NonEmpty input) (NonEmpty output)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ValueCodec input output -> Codec Value [input] [output]
forall input output.
ValueCodec input output -> ValueCodec [input] [output]
listCodec
where
parseNonEmptyList :: [a] -> Either String (NonEmpty a)
parseNonEmptyList [a]
l = case [a] -> Maybe (NonEmpty a)
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty [a]
l of
Maybe (NonEmpty a)
Nothing -> String -> Either String (NonEmpty a)
forall a b. a -> Either a b
Left String
"Expected a nonempty list, but got an empty list."
Just NonEmpty a
ne -> NonEmpty a -> Either String (NonEmpty a)
forall a b. b -> Either a b
Right NonEmpty a
ne
singleOrListCodec :: ValueCodec input output -> ValueCodec [input] [output]
singleOrListCodec :: ValueCodec input output -> ValueCodec [input] [output]
singleOrListCodec ValueCodec input output
c = (Either output [output] -> [output])
-> ([input] -> Either input [input])
-> Codec Value (Either input [input]) (Either output [output])
-> ValueCodec [input] [output]
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Either output [output] -> [output]
forall a. Either a [a] -> [a]
f [input] -> Either input [input]
forall a. [a] -> Either a [a]
g (Codec Value (Either input [input]) (Either output [output])
-> ValueCodec [input] [output])
-> Codec Value (Either input [input]) (Either output [output])
-> ValueCodec [input] [output]
forall a b. (a -> b) -> a -> b
$ ValueCodec input output
-> ValueCodec [input] [output]
-> Codec Value (Either input [input]) (Either output [output])
forall context input1 output1 input2 output2.
Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
eitherCodec ValueCodec input output
c (ValueCodec [input] [output]
-> Codec Value (Either input [input]) (Either output [output]))
-> ValueCodec [input] [output]
-> Codec Value (Either input [input]) (Either output [output])
forall a b. (a -> b) -> a -> b
$ ValueCodec input output -> ValueCodec [input] [output]
forall input output.
ValueCodec input output -> ValueCodec [input] [output]
listCodec ValueCodec input output
c
where
f :: Either a [a] -> [a]
f = \case
Left a
v -> [a
v]
Right [a]
vs -> [a]
vs
g :: [a] -> Either a [a]
g = \case
[a
v] -> a -> Either a [a]
forall a b. a -> Either a b
Left a
v
[a]
vs -> [a] -> Either a [a]
forall a b. b -> Either a b
Right [a]
vs
singleOrNonEmptyCodec :: ValueCodec input output -> ValueCodec (NonEmpty input) (NonEmpty output)
singleOrNonEmptyCodec :: ValueCodec input output
-> ValueCodec (NonEmpty input) (NonEmpty output)
singleOrNonEmptyCodec ValueCodec input output
c = (Either output (NonEmpty output) -> NonEmpty output)
-> (NonEmpty input -> Either input (NonEmpty input))
-> Codec
Value
(Either input (NonEmpty input))
(Either output (NonEmpty output))
-> ValueCodec (NonEmpty input) (NonEmpty output)
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Either output (NonEmpty output) -> NonEmpty output
forall a. Either a (NonEmpty a) -> NonEmpty a
f NonEmpty input -> Either input (NonEmpty input)
forall a. NonEmpty a -> Either a (NonEmpty a)
g (Codec
Value
(Either input (NonEmpty input))
(Either output (NonEmpty output))
-> ValueCodec (NonEmpty input) (NonEmpty output))
-> Codec
Value
(Either input (NonEmpty input))
(Either output (NonEmpty output))
-> ValueCodec (NonEmpty input) (NonEmpty output)
forall a b. (a -> b) -> a -> b
$ ValueCodec input output
-> ValueCodec (NonEmpty input) (NonEmpty output)
-> Codec
Value
(Either input (NonEmpty input))
(Either output (NonEmpty output))
forall context input1 output1 input2 output2.
Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
eitherCodec ValueCodec input output
c (ValueCodec (NonEmpty input) (NonEmpty output)
-> Codec
Value
(Either input (NonEmpty input))
(Either output (NonEmpty output)))
-> ValueCodec (NonEmpty input) (NonEmpty output)
-> Codec
Value
(Either input (NonEmpty input))
(Either output (NonEmpty output))
forall a b. (a -> b) -> a -> b
$ ValueCodec input output
-> ValueCodec (NonEmpty input) (NonEmpty output)
forall input output.
ValueCodec input output
-> ValueCodec (NonEmpty input) (NonEmpty output)
nonEmptyCodec ValueCodec input output
c
where
f :: Either a (NonEmpty a) -> NonEmpty a
f = \case
Left a
v -> a
v a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| []
Right NonEmpty a
vs -> NonEmpty a
vs
g :: NonEmpty a -> Either a (NonEmpty a)
g = \case
a
v :| [] -> a -> Either a (NonEmpty a)
forall a b. a -> Either a b
Left a
v
NonEmpty a
vs -> NonEmpty a -> Either a (NonEmpty a)
forall a b. b -> Either a b
Right NonEmpty a
vs
requiredFieldWith ::
Text ->
ValueCodec input output ->
Text ->
ObjectCodec input output
requiredFieldWith :: Text -> ValueCodec input output -> Text -> ObjectCodec input output
requiredFieldWith Text
key ValueCodec input output
c Text
doc = Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec input output
forall input output.
Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec input output
RequiredKeyCodec Text
key ValueCodec input output
c (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
doc)
requiredFieldWith' ::
Text ->
ValueCodec input output ->
ObjectCodec input output
requiredFieldWith' :: Text -> ValueCodec input output -> ObjectCodec input output
requiredFieldWith' Text
key ValueCodec input output
c = Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec input output
forall input output.
Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec input output
RequiredKeyCodec Text
key ValueCodec input output
c Maybe Text
forall a. Maybe a
Nothing
optionalFieldWith ::
Text ->
ValueCodec input output ->
Text ->
ObjectCodec (Maybe input) (Maybe output)
optionalFieldWith :: Text
-> ValueCodec input output
-> Text
-> ObjectCodec (Maybe input) (Maybe output)
optionalFieldWith Text
key ValueCodec input output
c Text
doc = Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec (Maybe input) (Maybe output)
forall input output.
Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec (Maybe input) (Maybe output)
OptionalKeyCodec Text
key ValueCodec input output
c (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
doc)
optionalFieldWith' ::
Text ->
ValueCodec input output ->
ObjectCodec (Maybe input) (Maybe output)
optionalFieldWith' :: Text
-> ValueCodec input output
-> ObjectCodec (Maybe input) (Maybe output)
optionalFieldWith' Text
key ValueCodec input output
c = Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec (Maybe input) (Maybe output)
forall input output.
Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec (Maybe input) (Maybe output)
OptionalKeyCodec Text
key ValueCodec input output
c Maybe Text
forall a. Maybe a
Nothing
optionalFieldWithDefaultWith ::
Text ->
JSONCodec output ->
output ->
Text ->
ObjectCodec output output
optionalFieldWithDefaultWith :: Text
-> JSONCodec output -> output -> Text -> ObjectCodec output output
optionalFieldWithDefaultWith Text
key JSONCodec output
c output
defaultValue Text
doc = Text
-> JSONCodec output
-> output
-> Maybe Text
-> ObjectCodec output output
forall value.
Text
-> ValueCodec value value
-> value
-> Maybe Text
-> ObjectCodec value value
OptionalKeyWithDefaultCodec Text
key JSONCodec output
c output
defaultValue (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
doc)
optionalFieldWithDefaultWith' ::
Text ->
JSONCodec output ->
output ->
ObjectCodec output output
optionalFieldWithDefaultWith' :: Text -> JSONCodec output -> output -> ObjectCodec output output
optionalFieldWithDefaultWith' Text
key JSONCodec output
c output
defaultValue = Text
-> JSONCodec output
-> output
-> Maybe Text
-> ObjectCodec output output
forall value.
Text
-> ValueCodec value value
-> value
-> Maybe Text
-> ObjectCodec value value
OptionalKeyWithDefaultCodec Text
key JSONCodec output
c output
defaultValue Maybe Text
forall a. Maybe a
Nothing
optionalFieldWithOmittedDefaultWith ::
Eq output =>
Text ->
JSONCodec output ->
output ->
Text ->
ObjectCodec output output
optionalFieldWithOmittedDefaultWith :: Text
-> JSONCodec output -> output -> Text -> ObjectCodec output output
optionalFieldWithOmittedDefaultWith Text
key JSONCodec output
c output
defaultValue Text
doc = Text
-> JSONCodec output
-> output
-> Maybe Text
-> ObjectCodec output output
forall value.
Eq value =>
Text
-> ValueCodec value value
-> value
-> Maybe Text
-> ObjectCodec value value
OptionalKeyWithOmittedDefaultCodec Text
key JSONCodec output
c output
defaultValue (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
doc)
optionalFieldWithOmittedDefaultWith' ::
Eq output =>
Text ->
JSONCodec output ->
output ->
ObjectCodec output output
optionalFieldWithOmittedDefaultWith' :: Text -> JSONCodec output -> output -> ObjectCodec output output
optionalFieldWithOmittedDefaultWith' Text
key JSONCodec output
c output
defaultValue = Text
-> JSONCodec output
-> output
-> Maybe Text
-> ObjectCodec output output
forall value.
Eq value =>
Text
-> ValueCodec value value
-> value
-> Maybe Text
-> ObjectCodec value value
OptionalKeyWithOmittedDefaultCodec Text
key JSONCodec output
c output
defaultValue Maybe Text
forall a. Maybe a
Nothing
optionalFieldOrNullWithOmittedDefaultWith ::
Eq output =>
Text ->
JSONCodec output ->
output ->
Text ->
ObjectCodec output output
optionalFieldOrNullWithOmittedDefaultWith :: Text
-> JSONCodec output -> output -> Text -> ObjectCodec output output
optionalFieldOrNullWithOmittedDefaultWith Text
key JSONCodec output
c output
defaultValue Text
doc = (Maybe output -> output)
-> (output -> Maybe output)
-> Codec Object (Maybe output) (Maybe output)
-> ObjectCodec output output
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Maybe output -> output
f output -> Maybe output
g (Codec Object (Maybe output) (Maybe output)
-> ObjectCodec output output)
-> Codec Object (Maybe output) (Maybe output)
-> ObjectCodec output output
forall a b. (a -> b) -> a -> b
$ Text
-> JSONCodec (Maybe output)
-> Maybe output
-> Text
-> Codec Object (Maybe output) (Maybe output)
forall output.
Eq output =>
Text
-> JSONCodec output -> output -> Text -> ObjectCodec output output
optionalFieldWithOmittedDefaultWith Text
key (JSONCodec output -> JSONCodec (Maybe output)
forall input output.
ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
maybeCodec JSONCodec output
c) (output -> Maybe output
forall a. a -> Maybe a
Just output
defaultValue) Text
doc
where
f :: Maybe output -> output
f = \case
Just output
v -> output
v
Maybe output
Nothing -> output
defaultValue
g :: output -> Maybe output
g output
v = if output
v output -> output -> Bool
forall a. Eq a => a -> a -> Bool
== output
defaultValue then Maybe output
forall a. Maybe a
Nothing else output -> Maybe output
forall a. a -> Maybe a
Just output
v
optionalFieldOrNullWithOmittedDefaultWith' ::
Eq output =>
Text ->
JSONCodec output ->
output ->
ObjectCodec output output
optionalFieldOrNullWithOmittedDefaultWith' :: Text -> JSONCodec output -> output -> ObjectCodec output output
optionalFieldOrNullWithOmittedDefaultWith' Text
key JSONCodec output
c output
defaultValue = (Maybe output -> output)
-> (output -> Maybe output)
-> Codec Object (Maybe output) (Maybe output)
-> ObjectCodec output output
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Maybe output -> output
f output -> Maybe output
g (Codec Object (Maybe output) (Maybe output)
-> ObjectCodec output output)
-> Codec Object (Maybe output) (Maybe output)
-> ObjectCodec output output
forall a b. (a -> b) -> a -> b
$ Text
-> JSONCodec (Maybe output)
-> Maybe output
-> Codec Object (Maybe output) (Maybe output)
forall output.
Eq output =>
Text -> JSONCodec output -> output -> ObjectCodec output output
optionalFieldWithOmittedDefaultWith' Text
key (JSONCodec output -> JSONCodec (Maybe output)
forall input output.
ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
maybeCodec JSONCodec output
c) (output -> Maybe output
forall a. a -> Maybe a
Just output
defaultValue)
where
f :: Maybe output -> output
f = \case
Just output
v -> output
v
Maybe output
Nothing -> output
defaultValue
g :: output -> Maybe output
g output
v = if output
v output -> output -> Bool
forall a. Eq a => a -> a -> Bool
== output
defaultValue then Maybe output
forall a. Maybe a
Nothing else output -> Maybe output
forall a. a -> Maybe a
Just output
v
optionalFieldOrNullWith ::
Text ->
ValueCodec input output ->
Text ->
ObjectCodec (Maybe input) (Maybe output)
optionalFieldOrNullWith :: Text
-> ValueCodec input output
-> Text
-> ObjectCodec (Maybe input) (Maybe output)
optionalFieldOrNullWith Text
key ValueCodec input output
c Text
doc = ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
forall input output.
ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
orNullHelper (ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output))
-> ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
forall a b. (a -> b) -> a -> b
$ Text
-> ValueCodec (Maybe input) (Maybe output)
-> Maybe Text
-> ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
forall input output.
Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec (Maybe input) (Maybe output)
OptionalKeyCodec Text
key (ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
forall input output.
ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
maybeCodec ValueCodec input output
c) (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
doc)
optionalFieldOrNullWith' ::
Text ->
ValueCodec input output ->
ObjectCodec (Maybe input) (Maybe output)
optionalFieldOrNullWith' :: Text
-> ValueCodec input output
-> ObjectCodec (Maybe input) (Maybe output)
optionalFieldOrNullWith' Text
key ValueCodec input output
c = ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
forall input output.
ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
orNullHelper (ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output))
-> ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
forall a b. (a -> b) -> a -> b
$ Text
-> ValueCodec (Maybe input) (Maybe output)
-> Maybe Text
-> ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
forall input output.
Text
-> ValueCodec input output
-> Maybe Text
-> ObjectCodec (Maybe input) (Maybe output)
OptionalKeyCodec Text
key (ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
forall input output.
ValueCodec input output -> ValueCodec (Maybe input) (Maybe output)
maybeCodec ValueCodec input output
c) Maybe Text
forall a. Maybe a
Nothing
(<?>) ::
ValueCodec input output ->
Text ->
ValueCodec input output
<?> :: ValueCodec input output -> Text -> ValueCodec input output
(<?>) = (Text -> ValueCodec input output -> ValueCodec input output)
-> ValueCodec input output -> Text -> ValueCodec input output
forall a b c. (a -> b -> c) -> b -> a -> c
flip Text -> ValueCodec input output -> ValueCodec input output
forall input output.
Text -> ValueCodec input output -> ValueCodec input output
CommentCodec
(<??>) ::
ValueCodec input output ->
[Text] ->
ValueCodec input output
<??> :: ValueCodec input output -> [Text] -> ValueCodec input output
(<??>) ValueCodec input output
c [Text]
ls = Text -> ValueCodec input output -> ValueCodec input output
forall input output.
Text -> ValueCodec input output -> ValueCodec input output
CommentCodec ([Text] -> Text
T.unlines [Text]
ls) ValueCodec input output
c
hashMapCodec ::
(Eq k, Hashable k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v ->
JSONCodec (HashMap k v)
hashMapCodec :: JSONCodec v -> JSONCodec (HashMap k v)
hashMapCodec = JSONCodec v -> JSONCodec (HashMap k v)
forall k v.
(Eq k, Hashable k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v -> JSONCodec (HashMap k v)
HashMapCodec
mapCodec ::
(Ord k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v ->
JSONCodec (Map k v)
mapCodec :: JSONCodec v -> JSONCodec (Map k v)
mapCodec = JSONCodec v -> JSONCodec (Map k v)
forall k v.
(Ord k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v -> JSONCodec (Map k v)
MapCodec
#if MIN_VERSION_aeson(2,0,0)
keyMapCodec ::
JSONCodec v ->
JSONCodec (KeyMap v)
keyMapCodec :: JSONCodec v -> JSONCodec (KeyMap v)
keyMapCodec = case Maybe (Coercion (Map Key Any) (KeyMap Any))
forall v. Maybe (Coercion (Map Key v) (KeyMap v))
KM.coercionToMap of
Just Coercion (Map Key Any) (KeyMap Any)
_ -> (Map Key v -> KeyMap v)
-> (KeyMap v -> Map Key v)
-> Codec Value (Map Key v) (Map Key v)
-> JSONCodec (KeyMap v)
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Map Key v -> KeyMap v
forall v. Map Key v -> KeyMap v
KM.fromMap KeyMap v -> Map Key v
forall v. KeyMap v -> Map Key v
KM.toMap (Codec Value (Map Key v) (Map Key v) -> JSONCodec (KeyMap v))
-> (JSONCodec v -> Codec Value (Map Key v) (Map Key v))
-> JSONCodec v
-> JSONCodec (KeyMap v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSONCodec v -> Codec Value (Map Key v) (Map Key v)
forall k v.
(Ord k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v -> JSONCodec (Map k v)
mapCodec
Maybe (Coercion (Map Key Any) (KeyMap Any))
Nothing -> (HashMap Key v -> KeyMap v)
-> (KeyMap v -> HashMap Key v)
-> Codec Value (HashMap Key v) (HashMap Key v)
-> JSONCodec (KeyMap v)
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec HashMap Key v -> KeyMap v
forall v. HashMap Key v -> KeyMap v
KM.fromHashMap KeyMap v -> HashMap Key v
forall v. KeyMap v -> HashMap Key v
KM.toHashMap (Codec Value (HashMap Key v) (HashMap Key v)
-> JSONCodec (KeyMap v))
-> (JSONCodec v -> Codec Value (HashMap Key v) (HashMap Key v))
-> JSONCodec v
-> JSONCodec (KeyMap v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSONCodec v -> Codec Value (HashMap Key v) (HashMap Key v)
forall k v.
(Eq k, Hashable k, FromJSONKey k, ToJSONKey k) =>
JSONCodec v -> JSONCodec (HashMap k v)
hashMapCodec
#endif
valueCodec :: JSONCodec JSON.Value
valueCodec :: JSONCodec Value
valueCodec = JSONCodec Value
ValueCodec
nullCodec :: JSONCodec ()
nullCodec :: Codec Value () ()
nullCodec = Codec Value () ()
NullCodec
boolCodec :: JSONCodec Bool
boolCodec :: JSONCodec Bool
boolCodec = Maybe Text -> JSONCodec Bool
BoolCodec Maybe Text
forall a. Maybe a
Nothing
textCodec :: JSONCodec Text
textCodec :: JSONCodec Text
textCodec = Maybe Text -> JSONCodec Text
StringCodec Maybe Text
forall a. Maybe a
Nothing
stringCodec :: JSONCodec String
stringCodec :: JSONCodec String
stringCodec = (Text -> String)
-> (String -> Text) -> JSONCodec Text -> JSONCodec String
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Text -> String
T.unpack String -> Text
T.pack JSONCodec Text
textCodec
scientificCodec :: JSONCodec Scientific
scientificCodec :: JSONCodec Scientific
scientificCodec = Maybe Text -> Maybe NumberBounds -> JSONCodec Scientific
NumberCodec Maybe Text
forall a. Maybe a
Nothing Maybe NumberBounds
forall a. Maybe a
Nothing
object :: Text -> ObjectCodec input output -> ValueCodec input output
object :: Text -> ObjectCodec input output -> ValueCodec input output
object Text
name = Maybe Text -> ObjectCodec input output -> ValueCodec input output
forall input output.
Maybe Text -> ObjectCodec input output -> ValueCodec input output
ObjectOfCodec (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
name)
boundedIntegralCodec :: forall i. (Integral i, Bounded i) => JSONCodec i
boundedIntegralCodec :: JSONCodec i
boundedIntegralCodec =
(Scientific -> Either String i)
-> (i -> Scientific) -> JSONCodec Scientific -> JSONCodec i
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
bimapCodec Scientific -> Either String i
forall b. (Integral b, Bounded b) => Scientific -> Either String b
go i -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral (JSONCodec Scientific -> JSONCodec i)
-> JSONCodec Scientific -> JSONCodec i
forall a b. (a -> b) -> a -> b
$
Maybe Text -> Maybe NumberBounds -> JSONCodec Scientific
NumberCodec
Maybe Text
forall a. Maybe a
Nothing
( NumberBounds -> Maybe NumberBounds
forall a. a -> Maybe a
Just ((Integral i, Bounded i) => NumberBounds
forall i. (Integral i, Bounded i) => NumberBounds
boundedIntegralNumberBounds @i)
)
where
go :: Scientific -> Either String b
go Scientific
s = case Scientific -> Maybe b
forall i. (Integral i, Bounded i) => Scientific -> Maybe i
Scientific.toBoundedInteger Scientific
s of
Maybe b
Nothing -> String -> Either String b
forall a b. a -> Either a b
Left (String -> Either String b) -> String -> Either String b
forall a b. (a -> b) -> a -> b
$ String
"Number did not fit into bounded integer: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Scientific -> String
forall a. Show a => a -> String
show Scientific
s
Just b
i -> b -> Either String b
forall a b. b -> Either a b
Right b
i
boundedIntegralNumberBounds :: forall i. (Integral i, Bounded i) => NumberBounds
boundedIntegralNumberBounds :: NumberBounds
boundedIntegralNumberBounds =
NumberBounds :: Scientific -> Scientific -> NumberBounds
NumberBounds
{ numberBoundsLower :: Scientific
numberBoundsLower = i -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral (i
forall a. Bounded a => a
minBound :: i),
numberBoundsUpper :: Scientific
numberBoundsUpper = i -> Scientific
forall a b. (Integral a, Num b) => a -> b
fromIntegral (i
forall a. Bounded a => a
maxBound :: i)
}
literalTextCodec :: Text -> JSONCodec Text
literalTextCodec :: Text -> JSONCodec Text
literalTextCodec Text
text = Text -> JSONCodec Text -> JSONCodec Text
forall value.
(Show value, Eq value) =>
value -> JSONCodec value -> JSONCodec value
EqCodec Text
text JSONCodec Text
textCodec
literalTextValueCodec :: value -> Text -> JSONCodec value
literalTextValueCodec :: value -> Text -> JSONCodec value
literalTextValueCodec value
value Text
text = (Text -> value)
-> (value -> Text) -> JSONCodec Text -> JSONCodec value
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec (value -> Text -> value
forall a b. a -> b -> a
const value
value) (Text -> value -> Text
forall a b. a -> b -> a
const Text
text) (Text -> JSONCodec Text
literalTextCodec Text
text)
matchChoiceCodec ::
Codec context input output ->
Codec context input output ->
(newInput -> Either input input) ->
Codec context newInput output
matchChoiceCodec :: Codec context input output
-> Codec context input output
-> (newInput -> Either input input)
-> Codec context newInput output
matchChoiceCodec Codec context input output
c1 Codec context input output
c2 newInput -> Either input input
renderingChooser =
(Either output output -> output)
-> (newInput -> Either input input)
-> Codec context (Either input input) (Either output output)
-> Codec context newInput output
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Either output output -> output
forall p. Either p p -> p
f newInput -> Either input input
renderingChooser (Codec context (Either input input) (Either output output)
-> Codec context newInput output)
-> Codec context (Either input input) (Either output output)
-> Codec context newInput output
forall a b. (a -> b) -> a -> b
$
Codec context input output
-> Codec context input output
-> Codec context (Either input input) (Either output output)
forall context input1 output1 input2 output2.
Codec context input1 output1
-> Codec context input2 output2
-> Codec context (Either input1 input2) (Either output1 output2)
eitherCodec Codec context input output
c1 Codec context input output
c2
where
f :: Either p p -> p
f = \case
Left p
a -> p
a
Right p
a -> p
a
matchChoicesCodec ::
[(input -> Maybe input, Codec context input output)] ->
Codec context input output ->
Codec context input output
matchChoicesCodec :: [(input -> Maybe input, Codec context input output)]
-> Codec context input output -> Codec context input output
matchChoicesCodec [(input -> Maybe input, Codec context input output)]
l Codec context input output
fallback = [(input -> Maybe input, Codec context input output)]
-> Codec context input output
go [(input -> Maybe input, Codec context input output)]
l
where
go :: [(input -> Maybe input, Codec context input output)]
-> Codec context input output
go = \case
[] -> Codec context input output
fallback
((input -> Maybe input
m, Codec context input output
c) : [(input -> Maybe input, Codec context input output)]
rest) -> Codec context input output
-> Codec context input output
-> (input -> Either input input)
-> Codec context input output
forall context input output newInput.
Codec context input output
-> Codec context input output
-> (newInput -> Either input input)
-> Codec context newInput output
matchChoiceCodec Codec context input output
c ([(input -> Maybe input, Codec context input output)]
-> Codec context input output
go [(input -> Maybe input, Codec context input output)]
rest) ((input -> Either input input) -> Codec context input output)
-> (input -> Either input input) -> Codec context input output
forall a b. (a -> b) -> a -> b
$ \input
i -> case input -> Maybe input
m input
i of
Just input
j -> input -> Either input input
forall a b. a -> Either a b
Left input
j
Maybe input
Nothing -> input -> Either input input
forall a b. b -> Either a b
Right input
i
parseAlternatives ::
Codec context input output ->
[Codec context input output] ->
Codec context input output
parseAlternatives :: Codec context input output
-> [Codec context input output] -> Codec context input output
parseAlternatives Codec context input output
c [Codec context input output]
rest = NonEmpty (Codec context input output) -> Codec context input output
forall context input output.
NonEmpty (Codec context input output) -> Codec context input output
go (Codec context input output
c Codec context input output
-> [Codec context input output]
-> NonEmpty (Codec context input output)
forall a. a -> [a] -> NonEmpty a
:| [Codec context input output]
rest)
where
go :: NonEmpty (Codec context input output) -> Codec context input output
go :: NonEmpty (Codec context input output) -> Codec context input output
go = \case
(Codec context input output
c' :| [Codec context input output]
cRest) -> case [Codec context input output]
-> Maybe (NonEmpty (Codec context input output))
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty [Codec context input output]
cRest of
Maybe (NonEmpty (Codec context input output))
Nothing -> Codec context input output
c'
Just NonEmpty (Codec context input output)
ne' -> Codec context input output
-> Codec context input output
-> (input -> Either input input)
-> Codec context input output
forall context input output newInput.
Codec context input output
-> Codec context input output
-> (newInput -> Either input input)
-> Codec context newInput output
matchChoiceCodec Codec context input output
c' (NonEmpty (Codec context input output) -> Codec context input output
forall context input output.
NonEmpty (Codec context input output) -> Codec context input output
go NonEmpty (Codec context input output)
ne') input -> Either input input
forall a b. a -> Either a b
Left
parseAlternative ::
Codec context input output ->
Codec context input output ->
Codec context input output
parseAlternative :: Codec context input output
-> Codec context input output -> Codec context input output
parseAlternative Codec context input output
c Codec context input output
cAlt = Codec context input output
-> [Codec context input output] -> Codec context input output
forall context input output.
Codec context input output
-> [Codec context input output] -> Codec context input output
parseAlternatives Codec context input output
c [Codec context input output
cAlt]
enumCodec ::
forall enum context.
Eq enum =>
NonEmpty (enum, Codec context enum enum) ->
Codec context enum enum
enumCodec :: NonEmpty (enum, Codec context enum enum) -> Codec context enum enum
enumCodec = NonEmpty (enum, Codec context enum enum) -> Codec context enum enum
go
where
go :: NonEmpty (enum, Codec context enum enum) -> Codec context enum enum
go :: NonEmpty (enum, Codec context enum enum) -> Codec context enum enum
go ((enum
e, Codec context enum enum
c) :| [(enum, Codec context enum enum)]
rest) = case [(enum, Codec context enum enum)]
-> Maybe (NonEmpty (enum, Codec context enum enum))
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty [(enum, Codec context enum enum)]
rest of
Maybe (NonEmpty (enum, Codec context enum enum))
Nothing -> Codec context enum enum
c
Just NonEmpty (enum, Codec context enum enum)
ne -> Codec context enum enum
-> Codec context enum enum
-> (enum -> Either enum enum)
-> Codec context enum enum
forall context input output newInput.
Codec context input output
-> Codec context input output
-> (newInput -> Either input input)
-> Codec context newInput output
matchChoiceCodec Codec context enum enum
c (NonEmpty (enum, Codec context enum enum) -> Codec context enum enum
go NonEmpty (enum, Codec context enum enum)
ne) ((enum -> Either enum enum) -> Codec context enum enum)
-> (enum -> Either enum enum) -> Codec context enum enum
forall a b. (a -> b) -> a -> b
$ \enum
i ->
if enum
e enum -> enum -> Bool
forall a. Eq a => a -> a -> Bool
== enum
i
then enum -> Either enum enum
forall a b. a -> Either a b
Left enum
e
else enum -> Either enum enum
forall a b. b -> Either a b
Right enum
i
stringConstCodec ::
forall constant.
Eq constant =>
NonEmpty (constant, Text) ->
JSONCodec constant
stringConstCodec :: NonEmpty (constant, Text) -> JSONCodec constant
stringConstCodec =
NonEmpty (constant, JSONCodec constant) -> JSONCodec constant
forall enum context.
Eq enum =>
NonEmpty (enum, Codec context enum enum) -> Codec context enum enum
enumCodec
(NonEmpty (constant, JSONCodec constant) -> JSONCodec constant)
-> (NonEmpty (constant, Text)
-> NonEmpty (constant, JSONCodec constant))
-> NonEmpty (constant, Text)
-> JSONCodec constant
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((constant, Text) -> (constant, JSONCodec constant))
-> NonEmpty (constant, Text)
-> NonEmpty (constant, JSONCodec constant)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
NE.map
( \(constant
constant, Text
text) ->
( constant
constant,
constant -> Text -> JSONCodec constant
forall value. value -> Text -> JSONCodec value
literalTextValueCodec constant
constant Text
text
)
)
shownBoundedEnumCodec ::
forall enum.
(Show enum, Eq enum, Enum enum, Bounded enum) =>
JSONCodec enum
shownBoundedEnumCodec :: JSONCodec enum
shownBoundedEnumCodec =
let ls :: [enum]
ls = [enum
forall a. Bounded a => a
minBound .. enum
forall a. Bounded a => a
maxBound]
in case [enum] -> Maybe (NonEmpty enum)
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty [enum]
ls of
Maybe (NonEmpty enum)
Nothing -> String -> JSONCodec enum
forall a. HasCallStack => String -> a
error String
"0 enum values ?!"
Just NonEmpty enum
ne -> NonEmpty (enum, Text) -> JSONCodec enum
forall constant.
Eq constant =>
NonEmpty (constant, Text) -> JSONCodec constant
stringConstCodec ((enum -> (enum, Text)) -> NonEmpty enum -> NonEmpty (enum, Text)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
NE.map (\enum
v -> (enum
v, String -> Text
T.pack (enum -> String
forall a. Show a => a -> String
show enum
v))) NonEmpty enum
ne)
orNullHelper ::
ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output)) ->
ObjectCodec (Maybe input) (Maybe output)
orNullHelper :: ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
orNullHelper = (Maybe (Maybe output) -> Maybe output)
-> (Maybe input -> Maybe (Maybe input))
-> ObjectCodec (Maybe (Maybe input)) (Maybe (Maybe output))
-> ObjectCodec (Maybe input) (Maybe output)
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
dimapCodec Maybe (Maybe output) -> Maybe output
forall input. Maybe (Maybe input) -> Maybe input
f Maybe input -> Maybe (Maybe input)
forall output. Maybe output -> Maybe (Maybe output)
g
where
f :: Maybe (Maybe input) -> Maybe input
f :: Maybe (Maybe input) -> Maybe input
f = \case
Maybe (Maybe input)
Nothing -> Maybe input
forall a. Maybe a
Nothing
Just Maybe input
Nothing -> Maybe input
forall a. Maybe a
Nothing
Just (Just input
a) -> input -> Maybe input
forall a. a -> Maybe a
Just input
a
g :: Maybe output -> Maybe (Maybe output)
g :: Maybe output -> Maybe (Maybe output)
g = \case
Maybe output
Nothing -> Maybe (Maybe output)
forall a. Maybe a
Nothing
Just output
a -> Maybe output -> Maybe (Maybe output)
forall a. a -> Maybe a
Just (output -> Maybe output
forall a. a -> Maybe a
Just output
a)
named :: Text -> ValueCodec input output -> ValueCodec input output
named :: Text -> ValueCodec input output -> ValueCodec input output
named = Text -> ValueCodec input output -> ValueCodec input output
forall input output.
Text -> ValueCodec input output -> ValueCodec input output
ReferenceCodec
codecViaAeson ::
(FromJSON a, ToJSON a) =>
Text ->
JSONCodec a
codecViaAeson :: Text -> JSONCodec a
codecViaAeson Text
doc = (Value -> Either String a)
-> (a -> Value) -> JSONCodec Value -> JSONCodec a
forall oldOutput newOutput newInput oldInput context.
(oldOutput -> Either String newOutput)
-> (newInput -> oldInput)
-> Codec context oldInput oldOutput
-> Codec context newInput newOutput
bimapCodec ((Value -> Parser a) -> Value -> Either String a
forall a b. (a -> Parser b) -> a -> Either String b
JSON.parseEither Value -> Parser a
forall a. FromJSON a => Value -> Parser a
JSON.parseJSON) a -> Value
forall a. ToJSON a => a -> Value
JSON.toJSON JSONCodec Value
valueCodec JSONCodec a -> Text -> JSONCodec a
forall input output.
ValueCodec input output -> Text -> ValueCodec input output
<?> Text
doc