argo 0.2022.2.23 → 0.2022.2.27
raw patch · 74 files changed
+2890/−2823 lines, 74 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Argo.Class.HasCodec: castValue :: String -> (Value -> Maybe a) -> ReaderT Value (ExceptT String Identity) a
- Argo.Class.HasCodec: class Typeable a => HasCodec a
- Argo.Class.HasCodec: codec :: HasCodec a => Value a
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b) => Argo.Class.HasCodec.HasCodec (Data.Either.Either a b)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b) => Argo.Class.HasCodec.HasCodec (a, b)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b, Argo.Class.HasCodec.HasCodec c) => Argo.Class.HasCodec.HasCodec (a, b, c)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b, Argo.Class.HasCodec.HasCodec c, Argo.Class.HasCodec.HasCodec d) => Argo.Class.HasCodec.HasCodec (a, b, c, d)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b, Argo.Class.HasCodec.HasCodec c, Argo.Class.HasCodec.HasCodec d, Argo.Class.HasCodec.HasCodec e) => Argo.Class.HasCodec.HasCodec (a, b, c, d, e)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b, Argo.Class.HasCodec.HasCodec c, Argo.Class.HasCodec.HasCodec d, Argo.Class.HasCodec.HasCodec e, Argo.Class.HasCodec.HasCodec f) => Argo.Class.HasCodec.HasCodec (a, b, c, d, e, f)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b, Argo.Class.HasCodec.HasCodec c, Argo.Class.HasCodec.HasCodec d, Argo.Class.HasCodec.HasCodec e, Argo.Class.HasCodec.HasCodec f, Argo.Class.HasCodec.HasCodec g) => Argo.Class.HasCodec.HasCodec (a, b, c, d, e, f, g)
- Argo.Class.HasCodec: instance (Argo.Class.HasCodec.HasCodec a, Argo.Class.HasCodec.HasCodec b, Argo.Class.HasCodec.HasCodec c, Argo.Class.HasCodec.HasCodec d, Argo.Class.HasCodec.HasCodec e, Argo.Class.HasCodec.HasCodec f, Argo.Class.HasCodec.HasCodec g, Argo.Class.HasCodec.HasCodec h) => Argo.Class.HasCodec.HasCodec (a, b, c, d, e, f, g, h)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec ()
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Json.Boolean.Boolean
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Json.Name.Name
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Json.Null.Null
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Json.Number.Number
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Json.String.String
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Json.Value.Value
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Pointer.Pointer.Pointer
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Schema.Identifier.Identifier
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Schema.Schema.Schema
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Type.Decimal.Decimal
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Argo.Vendor.Text.LazyText
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec Data.Text.Internal.Text
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Base.String
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Int.Int16
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Int.Int32
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Int.Int64
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Int.Int8
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Integer.Type.Integer
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Natural.Natural
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Types.Bool
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Types.Char
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Types.Double
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Types.Float
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Types.Int
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Types.Word
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Word.Word16
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Word.Word32
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Word.Word64
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec GHC.Word.Word8
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Argo.Json.Array.Array a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Argo.Json.Object.Object a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Argo.Type.Nullable.Nullable a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Data.Map.Internal.Map Argo.Json.Name.Name a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Data.Map.Internal.Map Argo.Json.String.String a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Data.Map.Internal.Map Argo.Vendor.Text.LazyText a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Data.Map.Internal.Map Data.Text.Internal.Text a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (Data.Map.Internal.Map GHC.Base.String a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (GHC.Base.NonEmpty a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec (GHC.Maybe.Maybe a)
- Argo.Class.HasCodec: instance Argo.Class.HasCodec.HasCodec a => Argo.Class.HasCodec.HasCodec [a]
- Argo.Class.HasCodec: integralCodec :: forall a. (Bits a, Bounded a, Integral a, Typeable a) => Value a
- Argo.Class.HasCodec: name :: String -> Name
- Argo.Class.HasCodec: nullable :: Typeable a => Value a -> Value (Nullable a)
- Argo.Class.HasCodec: optionalNullable :: Typeable a => Name -> Value a -> Object (Maybe a)
- Argo.Class.HasCodec: typeMismatch :: String -> Value -> String
- Argo.Class.HasCodec: valueCodec :: forall a. Typeable a => Schema -> (a -> Value) -> (Value -> Maybe a) -> Value a
- Argo.Codec.Array: element :: Value a -> Array a
- Argo.Codec.Array: fromArrayCodec :: Permission -> Array a -> Value a
- Argo.Codec.Array: type Array a = List (AccumT (Map Identifier Schema) Identity [(Maybe Identifier, Schema)]) Value a
- Argo.Codec.Codec: Codec :: r o -> (i -> w o) -> s -> Codec r w s i o
- Argo.Codec.Codec: [decode] :: Codec r w s i o -> r o
- Argo.Codec.Codec: [encode] :: Codec r w s i o -> i -> w o
- Argo.Codec.Codec: [schema] :: Codec r w s i o -> s
- Argo.Codec.Codec: data Codec r w s i o
- Argo.Codec.Codec: instance (GHC.Base.Alternative r, GHC.Base.Alternative w, GHC.Base.Applicative s, GHC.Base.Monoid a) => GHC.Base.Alternative (Argo.Codec.Codec.Codec r w (s a) i)
- Argo.Codec.Codec: instance (GHC.Base.Applicative r, GHC.Base.Applicative w, GHC.Base.Applicative s, GHC.Base.Monoid a) => GHC.Base.Applicative (Argo.Codec.Codec.Codec r w (s a) i)
- Argo.Codec.Codec: instance (GHC.Base.Functor r, GHC.Base.Functor w) => GHC.Base.Functor (Argo.Codec.Codec.Codec r w s i)
- Argo.Codec.Codec: map :: (Functor r, Functor w) => (a -> b) -> (b -> a) -> Codec r w s a a -> Codec r w s b b
- Argo.Codec.Codec: mapMaybe :: (Alternative r, Alternative w, Monad r, Monad w) => (o2 -> Maybe o1) -> (i1 -> Maybe i2) -> Codec r w s i2 o2 -> Codec r w s i1 o1
- Argo.Codec.Codec: project :: (i -> f) -> Codec r w s f o -> Codec r w s i o
- Argo.Codec.Codec: tap :: Functor f => (a -> f b) -> a -> f a
- Argo.Codec.Codec: toAlternative :: Alternative m => Maybe a -> m a
- Argo.Codec.List: fromListCodec :: (Permission -> s -> AccumT (Map Identifier Schema) Identity (Maybe Identifier, Schema)) -> Value [e] -> Permission -> List s e a -> Value a
- Argo.Codec.List: type List s e a = Codec (StateT [e] (ExceptT String Identity)) (WriterT [e] Identity) s a a
- Argo.Codec.Object: fromObjectCodec :: Permission -> Object a -> Value a
- Argo.Codec.Object: optional :: Name -> Value a -> Object (Optional a)
- Argo.Codec.Object: required :: Name -> Value a -> Object a
- Argo.Codec.Object: tagged :: String -> Value a -> Value a
- Argo.Codec.Object: type Object a = List (AccumT (Map Identifier Schema) Identity [((Name, Bool), (Maybe Identifier, Schema))]) (Member Value) a
- Argo.Codec.Value: arrayCodec :: Value (Array Value)
- Argo.Codec.Value: decodeWith :: Value a -> Value -> Either String a
- Argo.Codec.Value: encodeWith :: Value a -> a -> Value
- Argo.Codec.Value: getRef :: Value a -> AccumT (Map Identifier Schema) Identity Schema
- Argo.Codec.Value: identified :: forall a. Typeable a => Value a -> Value a
- Argo.Codec.Value: literalCodec :: Value -> Value ()
- Argo.Codec.Value: objectCodec :: Value (Object Value)
- Argo.Codec.Value: type Value a = Codec (ReaderT Value (ExceptT String Identity)) (MaybeT (StateT Value Identity)) (AccumT (Map Identifier Schema) Identity (Maybe Identifier, Schema)) a a
- Argo.Codec.Value: typeName :: Typeable a => Proxy a -> String
- Argo.Codec.Value: withIdentifier :: Identifier -> Value a -> Value a
- Argo.Decode: decode :: HasCodec a => ByteString -> Either String a
- Argo.Decode: decodePointer :: ByteString -> Either String Pointer
- Argo.Encode: encode :: HasCodec a => a -> Builder
- Argo.Encode: encodePointer :: Pointer -> Builder
- Argo.Encode: encodeWith :: HasCodec a => Indent -> a -> Builder
- Argo.Json.Array: Array :: [value] -> Array value
- Argo.Json.Array: decode :: Decoder value -> Decoder (Array value)
- Argo.Json.Array: encode :: (value -> Encoder ()) -> Array value -> Encoder ()
- Argo.Json.Array: fromList :: [value] -> Array value
- Argo.Json.Array: instance Control.DeepSeq.NFData value => Control.DeepSeq.NFData (Argo.Json.Array.Array value)
- Argo.Json.Array: instance GHC.Classes.Eq value => GHC.Classes.Eq (Argo.Json.Array.Array value)
- Argo.Json.Array: instance GHC.Generics.Generic (Argo.Json.Array.Array value)
- Argo.Json.Array: instance GHC.Show.Show value => GHC.Show.Show (Argo.Json.Array.Array value)
- Argo.Json.Array: instance Language.Haskell.TH.Syntax.Lift value => Language.Haskell.TH.Syntax.Lift (Argo.Json.Array.Array value)
- Argo.Json.Array: newtype Array value
- Argo.Json.Array: toList :: Array value -> [value]
- Argo.Json.Boolean: Boolean :: Bool -> Boolean
- Argo.Json.Boolean: decode :: Decoder Boolean
- Argo.Json.Boolean: decodeFalse :: Decoder Boolean
- Argo.Json.Boolean: decodeTrue :: Decoder Boolean
- Argo.Json.Boolean: encode :: Boolean -> Encoder ()
- Argo.Json.Boolean: fromBool :: Bool -> Boolean
- Argo.Json.Boolean: instance Control.DeepSeq.NFData Argo.Json.Boolean.Boolean
- Argo.Json.Boolean: instance GHC.Classes.Eq Argo.Json.Boolean.Boolean
- Argo.Json.Boolean: instance GHC.Generics.Generic Argo.Json.Boolean.Boolean
- Argo.Json.Boolean: instance GHC.Show.Show Argo.Json.Boolean.Boolean
- Argo.Json.Boolean: instance Language.Haskell.TH.Syntax.Lift Argo.Json.Boolean.Boolean
- Argo.Json.Boolean: newtype Boolean
- Argo.Json.Boolean: toBool :: Boolean -> Bool
- Argo.Json.Member: Member :: Name -> value -> Member value
- Argo.Json.Member: data Member value
- Argo.Json.Member: decode :: Decoder value -> Decoder (Member value)
- Argo.Json.Member: encode :: (value -> Encoder ()) -> Member value -> Encoder ()
- Argo.Json.Member: fromTuple :: (Name, value) -> Member value
- Argo.Json.Member: instance Control.DeepSeq.NFData value => Control.DeepSeq.NFData (Argo.Json.Member.Member value)
- Argo.Json.Member: instance GHC.Classes.Eq value => GHC.Classes.Eq (Argo.Json.Member.Member value)
- Argo.Json.Member: instance GHC.Generics.Generic (Argo.Json.Member.Member value)
- Argo.Json.Member: instance GHC.Show.Show value => GHC.Show.Show (Argo.Json.Member.Member value)
- Argo.Json.Member: instance Language.Haskell.TH.Syntax.Lift value => Language.Haskell.TH.Syntax.Lift (Argo.Json.Member.Member value)
- Argo.Json.Member: toTuple :: Member value -> (Name, value)
- Argo.Json.Name: Name :: String -> Name
- Argo.Json.Name: decode :: Decoder Name
- Argo.Json.Name: encode :: Name -> Encoder ()
- Argo.Json.Name: fromString :: String -> Name
- Argo.Json.Name: instance Control.DeepSeq.NFData Argo.Json.Name.Name
- Argo.Json.Name: instance Data.String.IsString Argo.Json.Name.Name
- Argo.Json.Name: instance GHC.Classes.Eq Argo.Json.Name.Name
- Argo.Json.Name: instance GHC.Classes.Ord Argo.Json.Name.Name
- Argo.Json.Name: instance GHC.Generics.Generic Argo.Json.Name.Name
- Argo.Json.Name: instance GHC.Show.Show Argo.Json.Name.Name
- Argo.Json.Name: instance Language.Haskell.TH.Syntax.Lift Argo.Json.Name.Name
- Argo.Json.Name: newtype Name
- Argo.Json.Name: toString :: Name -> String
- Argo.Json.Null: Null :: () -> Null
- Argo.Json.Null: decode :: Decoder Null
- Argo.Json.Null: encode :: Null -> Encoder ()
- Argo.Json.Null: fromUnit :: () -> Null
- Argo.Json.Null: instance Control.DeepSeq.NFData Argo.Json.Null.Null
- Argo.Json.Null: instance GHC.Classes.Eq Argo.Json.Null.Null
- Argo.Json.Null: instance GHC.Generics.Generic Argo.Json.Null.Null
- Argo.Json.Null: instance GHC.Show.Show Argo.Json.Null.Null
- Argo.Json.Null: instance Language.Haskell.TH.Syntax.Lift Argo.Json.Null.Null
- Argo.Json.Null: newtype Null
- Argo.Json.Null: toUnit :: Null -> ()
- Argo.Json.Number: Number :: Decimal -> Number
- Argo.Json.Number: decode :: Decoder Number
- Argo.Json.Number: encode :: Number -> Encoder ()
- Argo.Json.Number: fromDecimal :: Decimal -> Number
- Argo.Json.Number: fromDigits :: ByteString -> Integer
- Argo.Json.Number: instance Control.DeepSeq.NFData Argo.Json.Number.Number
- Argo.Json.Number: instance GHC.Classes.Eq Argo.Json.Number.Number
- Argo.Json.Number: instance GHC.Generics.Generic Argo.Json.Number.Number
- Argo.Json.Number: instance GHC.Show.Show Argo.Json.Number.Number
- Argo.Json.Number: instance Language.Haskell.TH.Syntax.Lift Argo.Json.Number.Number
- Argo.Json.Number: intToInteger :: Int -> Integer
- Argo.Json.Number: negateIf :: Bool -> Integer -> Integer
- Argo.Json.Number: newtype Number
- Argo.Json.Number: toDecimal :: Number -> Decimal
- Argo.Json.Number: word8ToInteger :: Word8 -> Integer
- Argo.Json.Object: Object :: [Member value] -> Object value
- Argo.Json.Object: decode :: Decoder value -> Decoder (Object value)
- Argo.Json.Object: encode :: (value -> Encoder ()) -> Object value -> Encoder ()
- Argo.Json.Object: encodeElement :: (value -> Encoder ()) -> Int -> Member value -> Encoder ()
- Argo.Json.Object: fromList :: [Member value] -> Object value
- Argo.Json.Object: instance Control.DeepSeq.NFData value => Control.DeepSeq.NFData (Argo.Json.Object.Object value)
- Argo.Json.Object: instance GHC.Classes.Eq value => GHC.Classes.Eq (Argo.Json.Object.Object value)
- Argo.Json.Object: instance GHC.Generics.Generic (Argo.Json.Object.Object value)
- Argo.Json.Object: instance GHC.Show.Show value => GHC.Show.Show (Argo.Json.Object.Object value)
- Argo.Json.Object: instance Language.Haskell.TH.Syntax.Lift value => Language.Haskell.TH.Syntax.Lift (Argo.Json.Object.Object value)
- Argo.Json.Object: newtype Object value
- Argo.Json.Object: toList :: Object value -> [Member value]
- Argo.Json.String: String :: Text -> String
- Argo.Json.String: combineSurrogatePair :: Char -> Char -> Char
- Argo.Json.String: combineSurrogatePairs :: String -> String
- Argo.Json.String: countConsecutive :: Word8 -> Int -> ByteString -> Int
- Argo.Json.String: decode :: Decoder String
- Argo.Json.String: encode :: String -> Encoder ()
- Argo.Json.String: encodeChar :: BoundedPrim Word8
- Argo.Json.String: encodeLongEscape :: BoundedPrim Word8
- Argo.Json.String: encodeShortEscape :: Word8 -> BoundedPrim a
- Argo.Json.String: findAt :: Word8 -> Int -> ByteString -> Maybe Int
- Argo.Json.String: fromHexadecimalDigit :: Char -> Maybe Int
- Argo.Json.String: fromLongEscape :: Char -> Char -> Char -> Char -> Maybe Char
- Argo.Json.String: fromText :: Text -> String
- Argo.Json.String: getClose :: ByteString -> Int -> Maybe Int
- Argo.Json.String: instance Control.DeepSeq.NFData Argo.Json.String.String
- Argo.Json.String: instance Data.String.IsString Argo.Json.String.String
- Argo.Json.String: instance GHC.Classes.Eq Argo.Json.String.String
- Argo.Json.String: instance GHC.Classes.Ord Argo.Json.String.String
- Argo.Json.String: instance GHC.Generics.Generic Argo.Json.String.String
- Argo.Json.String: instance GHC.Show.Show Argo.Json.String.String
- Argo.Json.String: instance Language.Haskell.TH.Syntax.Lift Argo.Json.String.String
- Argo.Json.String: isHighSurrogate :: Char -> Bool
- Argo.Json.String: isLowSurrogate :: Char -> Bool
- Argo.Json.String: newtype String
- Argo.Json.String: toText :: String -> Text
- Argo.Json.String: unescapeString :: String -> Either String String
- Argo.Json.String: unescapeText :: Text -> Either String Text
- Argo.Json.String: word8ToWord16 :: Word8 -> Word16
- Argo.Json.Value: Array :: Array Value -> Value
- Argo.Json.Value: Boolean :: Boolean -> Value
- Argo.Json.Value: Null :: Null -> Value
- Argo.Json.Value: Number :: Number -> Value
- Argo.Json.Value: Object :: Object Value -> Value
- Argo.Json.Value: String :: String -> Value
- Argo.Json.Value: data Value
- Argo.Json.Value: decode :: Decoder Value
- Argo.Json.Value: encode :: Value -> Encoder ()
- Argo.Json.Value: instance Control.DeepSeq.NFData Argo.Json.Value.Value
- Argo.Json.Value: instance Data.String.IsString Argo.Json.Value.Value
- Argo.Json.Value: instance GHC.Classes.Eq Argo.Json.Value.Value
- Argo.Json.Value: instance GHC.Generics.Generic Argo.Json.Value.Value
- Argo.Json.Value: instance GHC.Show.Show Argo.Json.Value.Value
- Argo.Json.Value: instance Language.Haskell.TH.Syntax.Lift Argo.Json.Value.Value
- Argo.Literal: backspace :: Word8
- Argo.Literal: carriageReturn :: Word8
- Argo.Literal: colon :: Word8
- Argo.Literal: comma :: Word8
- Argo.Literal: digitNine :: Word8
- Argo.Literal: digitOne :: Word8
- Argo.Literal: digitZero :: Word8
- Argo.Literal: false :: ByteString
- Argo.Literal: formFeed :: Word8
- Argo.Literal: fullStop :: Word8
- Argo.Literal: horizontalTabulation :: Word8
- Argo.Literal: hyphenMinus :: Word8
- Argo.Literal: latinCapitalLetterE :: Word8
- Argo.Literal: latinSmallLetterB :: Word8
- Argo.Literal: latinSmallLetterE :: Word8
- Argo.Literal: latinSmallLetterF :: Word8
- Argo.Literal: latinSmallLetterN :: Word8
- Argo.Literal: latinSmallLetterR :: Word8
- Argo.Literal: latinSmallLetterT :: Word8
- Argo.Literal: latinSmallLetterU :: Word8
- Argo.Literal: leftCurlyBracket :: Word8
- Argo.Literal: leftSquareBracket :: Word8
- Argo.Literal: newLine :: Word8
- Argo.Literal: null :: ByteString
- Argo.Literal: plusSign :: Word8
- Argo.Literal: quotationMark :: Word8
- Argo.Literal: reverseSolidus :: Word8
- Argo.Literal: rightCurlyBracket :: Word8
- Argo.Literal: rightSquareBracket :: Word8
- Argo.Literal: solidus :: Word8
- Argo.Literal: space :: Word8
- Argo.Literal: tilde :: Word8
- Argo.Literal: true :: ByteString
- Argo.Main: getFlags :: [String] -> (([String], [String]), [Flag])
- Argo.Main: main :: IO ()
- Argo.Main: mainWith :: String -> [String] -> IO ()
- Argo.Main: options :: [OptDescr Flag]
- Argo.Main: quote :: String -> String
- Argo.Main: version :: String
- Argo.Main: withSettings :: String -> [Flag] -> (Settings -> IO ()) -> IO ()
- Argo.Pattern: pattern Array :: [Value] -> Value
- Argo.Pattern: pattern Boolean :: Bool -> Value
- Argo.Pattern: pattern Decimal :: Integer -> Integer -> Decimal
- Argo.Pattern: pattern Name :: Text -> Name
- Argo.Pattern: pattern Null :: Value
- Argo.Pattern: pattern Number :: Decimal -> Value
- Argo.Pattern: pattern Object :: [Member Value] -> Value
- Argo.Pattern: pattern String :: Text -> Value
- Argo.Pointer.Pointer: Pointer :: [Token] -> Pointer
- Argo.Pointer.Pointer: atIndex :: Token -> Array value -> Either String value
- Argo.Pointer.Pointer: atKey :: Token -> Object value -> Either String value
- Argo.Pointer.Pointer: decode :: Decoder Pointer
- Argo.Pointer.Pointer: decodeToken :: Decoder Token
- Argo.Pointer.Pointer: encode :: Pointer -> Encoder ()
- Argo.Pointer.Pointer: encodeToken :: Token -> Encoder ()
- Argo.Pointer.Pointer: evaluate :: Pointer -> Value -> Either String Value
- Argo.Pointer.Pointer: fromList :: [Token] -> Pointer
- Argo.Pointer.Pointer: instance Control.DeepSeq.NFData Argo.Pointer.Pointer.Pointer
- Argo.Pointer.Pointer: instance GHC.Classes.Eq Argo.Pointer.Pointer.Pointer
- Argo.Pointer.Pointer: instance GHC.Generics.Generic Argo.Pointer.Pointer.Pointer
- Argo.Pointer.Pointer: instance GHC.Show.Show Argo.Pointer.Pointer.Pointer
- Argo.Pointer.Pointer: instance Language.Haskell.TH.Syntax.Lift Argo.Pointer.Pointer.Pointer
- Argo.Pointer.Pointer: newtype Pointer
- Argo.Pointer.Pointer: toList :: Pointer -> [Token]
- Argo.Pointer.Pointer: tokenToIndex :: Token -> Either String Int
- Argo.Pointer.Token: Token :: Text -> Token
- Argo.Pointer.Token: decode :: Decoder Token
- Argo.Pointer.Token: encode :: Token -> Encoder ()
- Argo.Pointer.Token: encodeChar :: BoundedPrim Word8
- Argo.Pointer.Token: encodeEscape :: Word8 -> BoundedPrim a
- Argo.Pointer.Token: fromText :: Text -> Token
- Argo.Pointer.Token: instance Control.DeepSeq.NFData Argo.Pointer.Token.Token
- Argo.Pointer.Token: instance Data.String.IsString Argo.Pointer.Token.Token
- Argo.Pointer.Token: instance GHC.Classes.Eq Argo.Pointer.Token.Token
- Argo.Pointer.Token: instance GHC.Generics.Generic Argo.Pointer.Token.Token
- Argo.Pointer.Token: instance GHC.Show.Show Argo.Pointer.Token.Token
- Argo.Pointer.Token: instance Language.Haskell.TH.Syntax.Lift Argo.Pointer.Token.Token
- Argo.Pointer.Token: newtype Token
- Argo.Pointer.Token: toText :: Token -> Text
- Argo.Pointer.Token: unescape :: ByteString -> Either String ByteString
- Argo.Pointer.Token: unescapeHelper :: [Word8] -> Either String [Word8]
- Argo.QuasiQuoter: asValue :: Value -> Value
- Argo.QuasiQuoter: defaultQuasiQuoter :: QuasiQuoter
- Argo.QuasiQuoter: pointer :: QuasiQuoter
- Argo.QuasiQuoter: value :: QuasiQuoter
- Argo.Schema.Identifier: Identifier :: Text -> Identifier
- Argo.Schema.Identifier: fromText :: Text -> Identifier
- Argo.Schema.Identifier: instance Control.DeepSeq.NFData Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance Data.String.IsString Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance GHC.Base.Semigroup Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance GHC.Classes.Eq Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance GHC.Classes.Ord Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance GHC.Generics.Generic Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance GHC.Show.Show Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: instance Language.Haskell.TH.Syntax.Lift Argo.Schema.Identifier.Identifier
- Argo.Schema.Identifier: newtype Identifier
- Argo.Schema.Identifier: toText :: Identifier -> Text
- Argo.Schema.Schema: Array :: Maybe Natural -> Maybe Natural -> Either Schema (NonEmpty Schema) -> Maybe Schema -> Schema
- Argo.Schema.Schema: Boolean :: Schema
- Argo.Schema.Schema: Const :: Value -> Schema
- Argo.Schema.Schema: False :: Schema
- Argo.Schema.Schema: Integer :: Maybe Integer -> Maybe Integer -> Schema
- Argo.Schema.Schema: Null :: Schema
- Argo.Schema.Schema: Number :: Schema
- Argo.Schema.Schema: Object :: [(Name, Schema)] -> [Name] -> Maybe Schema -> Schema
- Argo.Schema.Schema: OneOf :: [Schema] -> Schema
- Argo.Schema.Schema: Ref :: Identifier -> Schema
- Argo.Schema.Schema: String :: Maybe Natural -> Maybe Natural -> Schema
- Argo.Schema.Schema: True :: Schema
- Argo.Schema.Schema: data Schema
- Argo.Schema.Schema: false :: Schema
- Argo.Schema.Schema: instance Control.DeepSeq.NFData Argo.Schema.Schema.Schema
- Argo.Schema.Schema: instance GHC.Base.Monoid Argo.Schema.Schema.Schema
- Argo.Schema.Schema: instance GHC.Base.Semigroup Argo.Schema.Schema.Schema
- Argo.Schema.Schema: instance GHC.Classes.Eq Argo.Schema.Schema.Schema
- Argo.Schema.Schema: instance GHC.Generics.Generic Argo.Schema.Schema.Schema
- Argo.Schema.Schema: instance GHC.Show.Show Argo.Schema.Schema.Schema
- Argo.Schema.Schema: instance Language.Haskell.TH.Syntax.Lift Argo.Schema.Schema.Schema
- Argo.Schema.Schema: maybeRef :: (Maybe Identifier, Schema) -> Schema
- Argo.Schema.Schema: member :: String -> a -> Member a
- Argo.Schema.Schema: true :: Schema
- Argo.Schema.Schema: unidentified :: Schema -> (Maybe Identifier, Schema)
- Argo.Schema.Schema: withIdentifier :: Identifier -> Schema -> (Maybe Identifier, Schema)
- Argo.Type.Config: Config :: Indent -> Int -> Config
- Argo.Type.Config: [indent] :: Config -> Indent
- Argo.Type.Config: [level] :: Config -> Int
- Argo.Type.Config: data Config
- Argo.Type.Config: hasIndent :: Config -> Bool
- Argo.Type.Config: increaseLevel :: Config -> Config
- Argo.Type.Config: initial :: Config
- Argo.Type.Config: instance GHC.Classes.Eq Argo.Type.Config.Config
- Argo.Type.Config: instance GHC.Show.Show Argo.Type.Config.Config
- Argo.Type.Decimal: Decimal :: Integer -> Integer -> Decimal
- Argo.Type.Decimal: data Decimal
- Argo.Type.Decimal: decimal :: Integer -> Integer -> Decimal
- Argo.Type.Decimal: factor :: (Num a, Integral b) => b -> a -> b -> (a, b)
- Argo.Type.Decimal: fromDigits :: [Int] -> Int -> Decimal
- Argo.Type.Decimal: fromInteger :: Integer -> Decimal
- Argo.Type.Decimal: fromRational :: Rational -> Maybe Decimal
- Argo.Type.Decimal: fromRealFloat :: RealFloat a => a -> Maybe Decimal
- Argo.Type.Decimal: instance Control.DeepSeq.NFData Argo.Type.Decimal.Decimal
- Argo.Type.Decimal: instance GHC.Classes.Eq Argo.Type.Decimal.Decimal
- Argo.Type.Decimal: instance GHC.Generics.Generic Argo.Type.Decimal.Decimal
- Argo.Type.Decimal: instance GHC.Show.Show Argo.Type.Decimal.Decimal
- Argo.Type.Decimal: instance Language.Haskell.TH.Syntax.Lift Argo.Type.Decimal.Decimal
- Argo.Type.Decimal: negate :: Decimal -> Decimal
- Argo.Type.Decimal: normalize :: Decimal -> Decimal
- Argo.Type.Decimal: toInteger :: Decimal -> Maybe Integer
- Argo.Type.Decimal: toRational :: Decimal -> Rational
- Argo.Type.Decimal: toRealFloat :: RealFloat a => Decimal -> a
- Argo.Type.Decoder: byteString :: ByteString -> Decoder ()
- Argo.Type.Decoder: dropWhile :: (Word8 -> Bool) -> Decoder ()
- Argo.Type.Decoder: eof :: Decoder ()
- Argo.Type.Decoder: isDigit :: Word8 -> Bool
- Argo.Type.Decoder: isSpace :: Word8 -> Bool
- Argo.Type.Decoder: list :: Decoder a -> Decoder [a]
- Argo.Type.Decoder: listWith :: Decoder a -> [a] -> Decoder [a]
- Argo.Type.Decoder: run :: Decoder a -> ByteString -> Either String a
- Argo.Type.Decoder: satisfy :: (Word8 -> Bool) -> Decoder Word8
- Argo.Type.Decoder: spaces :: Decoder ()
- Argo.Type.Decoder: takeWhile :: (Word8 -> Bool) -> Decoder ByteString
- Argo.Type.Decoder: takeWhile1 :: (Word8 -> Bool) -> Decoder ByteString
- Argo.Type.Decoder: type Decoder = StateT ByteString (ExceptT String Identity)
- Argo.Type.Decoder: unwrap :: Decoder a -> ByteString -> Either String (a, ByteString)
- Argo.Type.Decoder: word8 :: Word8 -> Decoder ()
- Argo.Type.Encoder: list :: Encoder () -> Encoder () -> Encoder () -> (a -> Encoder ()) -> [a] -> Encoder ()
- Argo.Type.Encoder: makeIndent :: Config -> Maybe Builder
- Argo.Type.Encoder: run :: Config -> Encoder a -> Builder
- Argo.Type.Encoder: type Encoder = ReaderT Config (WriterT Builder Identity)
- Argo.Type.Encoder: unwrap :: Config -> Encoder a -> (a, Builder)
- Argo.Type.Encoder: withNewLine :: Maybe Builder -> Encoder ()
- Argo.Type.Flag: Help :: Flag
- Argo.Type.Flag: Spaces :: String -> Flag
- Argo.Type.Flag: Tab :: Flag
- Argo.Type.Flag: Version :: Flag
- Argo.Type.Flag: data Flag
- Argo.Type.Flag: instance GHC.Classes.Eq Argo.Type.Flag.Flag
- Argo.Type.Flag: instance GHC.Show.Show Argo.Type.Flag.Flag
- Argo.Type.Indent: Spaces :: Int -> Indent
- Argo.Type.Indent: Tab :: Indent
- Argo.Type.Indent: data Indent
- Argo.Type.Indent: instance GHC.Classes.Eq Argo.Type.Indent.Indent
- Argo.Type.Indent: instance GHC.Show.Show Argo.Type.Indent.Indent
- Argo.Type.Nullable: Nullable :: Maybe a -> Nullable a
- Argo.Type.Nullable: fromMaybe :: Maybe a -> Nullable a
- Argo.Type.Nullable: instance GHC.Classes.Eq a => GHC.Classes.Eq (Argo.Type.Nullable.Nullable a)
- Argo.Type.Nullable: instance GHC.Show.Show a => GHC.Show.Show (Argo.Type.Nullable.Nullable a)
- Argo.Type.Nullable: just :: a -> Nullable a
- Argo.Type.Nullable: newtype Nullable a
- Argo.Type.Nullable: nothing :: Nullable a
- Argo.Type.Nullable: toMaybe :: Nullable a -> Maybe a
- Argo.Type.Optional: Optional :: Maybe a -> Optional a
- Argo.Type.Optional: fromMaybe :: Maybe a -> Optional a
- Argo.Type.Optional: instance GHC.Classes.Eq a => GHC.Classes.Eq (Argo.Type.Optional.Optional a)
- Argo.Type.Optional: instance GHC.Show.Show a => GHC.Show.Show (Argo.Type.Optional.Optional a)
- Argo.Type.Optional: just :: a -> Optional a
- Argo.Type.Optional: newtype Optional a
- Argo.Type.Optional: nothing :: Optional a
- Argo.Type.Optional: toMaybe :: Optional a -> Maybe a
- Argo.Type.Permission: Allow :: Permission
- Argo.Type.Permission: Forbid :: Permission
- Argo.Type.Permission: data Permission
- Argo.Type.Permission: instance Control.DeepSeq.NFData Argo.Type.Permission.Permission
- Argo.Type.Permission: instance GHC.Classes.Eq Argo.Type.Permission.Permission
- Argo.Type.Permission: instance GHC.Generics.Generic Argo.Type.Permission.Permission
- Argo.Type.Permission: instance GHC.Show.Show Argo.Type.Permission.Permission
- Argo.Type.Permission: instance Language.Haskell.TH.Syntax.Lift Argo.Type.Permission.Permission
- Argo.Type.Permission: toBool :: Permission -> Bool
- Argo.Type.Settings: Settings :: Bool -> Indent -> Bool -> Settings
- Argo.Type.Settings: [help] :: Settings -> Bool
- Argo.Type.Settings: [indent] :: Settings -> Indent
- Argo.Type.Settings: [version] :: Settings -> Bool
- Argo.Type.Settings: applyFlag :: Settings -> Flag -> Either String Settings
- Argo.Type.Settings: data Settings
- Argo.Type.Settings: initial :: Settings
- Argo.Type.Settings: instance GHC.Classes.Eq Argo.Type.Settings.Settings
- Argo.Type.Settings: instance GHC.Show.Show Argo.Type.Settings.Settings
+ Argo: Allow :: Permission
+ Argo: Forbid :: Permission
+ Argo: Identifier :: Text -> Identifier
+ Argo: data Permission
+ Argo: element :: HasCodec o => (i -> o) -> Element i o
+ Argo: fromArrayCodec :: Permission -> Array a -> Value a
+ Argo: fromObjectCodec :: Permission -> Object a -> Value a
+ Argo: fromValue :: HasCodec a => Value -> Either String a
+ Argo: identified :: forall a. Typeable a => Value a -> Value a
+ Argo: map :: (Functor r, Functor w) => (a -> b) -> (b -> a) -> Codec r w s a a -> Codec r w s b b
+ Argo: mapMaybe :: (Alternative r, Alternative w, Monad r, Monad w) => (o2 -> Maybe o1) -> (i1 -> Maybe i2) -> Codec r w s i2 o2 -> Codec r w s i1 o1
+ Argo: newtype Identifier
+ Argo: oneOf :: Foldable t => t Schema -> Schema
+ Argo: optional :: HasCodec f => (i -> Maybe f) -> Name -> Member i (Maybe f)
+ Argo: project :: (i -> f) -> Codec r w s f o -> Codec r w s i o
+ Argo: required :: HasCodec f => (i -> f) -> Name -> Member i f
+ Argo: schema :: Codec r w s i o -> s
+ Argo: toValue :: HasCodec a => a -> Value
+ Argo: type Codec a = Value a
+ Argo: withIdentifier :: Identifier -> Value a -> Value a
+ Argo.Internal.Class.HasCodec: castValue :: String -> (Value -> Maybe a) -> ReaderT Value (ExceptT String Identity) a
+ Argo.Internal.Class.HasCodec: class Typeable a => HasCodec a
+ Argo.Internal.Class.HasCodec: codec :: HasCodec a => Value a
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b) => Argo.Internal.Class.HasCodec.HasCodec (Data.Either.Either a b)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b) => Argo.Internal.Class.HasCodec.HasCodec (a, b)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b, Argo.Internal.Class.HasCodec.HasCodec c) => Argo.Internal.Class.HasCodec.HasCodec (a, b, c)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b, Argo.Internal.Class.HasCodec.HasCodec c, Argo.Internal.Class.HasCodec.HasCodec d) => Argo.Internal.Class.HasCodec.HasCodec (a, b, c, d)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b, Argo.Internal.Class.HasCodec.HasCodec c, Argo.Internal.Class.HasCodec.HasCodec d, Argo.Internal.Class.HasCodec.HasCodec e) => Argo.Internal.Class.HasCodec.HasCodec (a, b, c, d, e)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b, Argo.Internal.Class.HasCodec.HasCodec c, Argo.Internal.Class.HasCodec.HasCodec d, Argo.Internal.Class.HasCodec.HasCodec e, Argo.Internal.Class.HasCodec.HasCodec f) => Argo.Internal.Class.HasCodec.HasCodec (a, b, c, d, e, f)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b, Argo.Internal.Class.HasCodec.HasCodec c, Argo.Internal.Class.HasCodec.HasCodec d, Argo.Internal.Class.HasCodec.HasCodec e, Argo.Internal.Class.HasCodec.HasCodec f, Argo.Internal.Class.HasCodec.HasCodec g) => Argo.Internal.Class.HasCodec.HasCodec (a, b, c, d, e, f, g)
+ Argo.Internal.Class.HasCodec: instance (Argo.Internal.Class.HasCodec.HasCodec a, Argo.Internal.Class.HasCodec.HasCodec b, Argo.Internal.Class.HasCodec.HasCodec c, Argo.Internal.Class.HasCodec.HasCodec d, Argo.Internal.Class.HasCodec.HasCodec e, Argo.Internal.Class.HasCodec.HasCodec f, Argo.Internal.Class.HasCodec.HasCodec g, Argo.Internal.Class.HasCodec.HasCodec h) => Argo.Internal.Class.HasCodec.HasCodec (a, b, c, d, e, f, g, h)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec ()
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Json.Boolean.Boolean
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Json.Name.Name
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Json.Null.Null
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Json.Number.Number
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Json.String.String
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Json.Value.Value
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Pointer.Pointer.Pointer
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Internal.Type.Decimal.Decimal
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Argo.Vendor.Text.LazyText
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec Data.Text.Internal.Text
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Base.String
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Int.Int16
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Int.Int32
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Int.Int64
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Int.Int8
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Integer.Type.Integer
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Natural.Natural
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Types.Bool
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Types.Char
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Types.Double
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Types.Float
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Types.Int
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Types.Word
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Word.Word16
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Word.Word32
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Word.Word64
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec GHC.Word.Word8
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Argo.Internal.Json.Array.Array a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Argo.Internal.Json.Object.Object a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Argo.Internal.Type.Nullable.Nullable a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Data.Map.Internal.Map Argo.Internal.Json.Name.Name a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Data.Map.Internal.Map Argo.Internal.Json.String.String a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Data.Map.Internal.Map Argo.Vendor.Text.LazyText a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Data.Map.Internal.Map Data.Text.Internal.Text a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (Data.Map.Internal.Map GHC.Base.String a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (GHC.Base.NonEmpty a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec (GHC.Maybe.Maybe a)
+ Argo.Internal.Class.HasCodec: instance Argo.Internal.Class.HasCodec.HasCodec a => Argo.Internal.Class.HasCodec.HasCodec [a]
+ Argo.Internal.Class.HasCodec: integralCodec :: forall a. (Bits a, Bounded a, Integral a, Typeable a) => Value a
+ Argo.Internal.Class.HasCodec: name :: String -> Name
+ Argo.Internal.Class.HasCodec: nullable :: Typeable a => Value a -> Value (Nullable a)
+ Argo.Internal.Class.HasCodec: optionalNullable :: Typeable a => Name -> Value a -> Object (Maybe a)
+ Argo.Internal.Class.HasCodec: typeMismatch :: String -> Value -> String
+ Argo.Internal.Class.HasCodec: valueCodec :: forall a. Typeable a => Schema -> (a -> Value) -> (Value -> Maybe a) -> Value a
+ Argo.Internal.Codec.Array: element :: Value a -> Array a
+ Argo.Internal.Codec.Array: fromArrayCodec :: Permission -> Array a -> Value a
+ Argo.Internal.Codec.Array: type Array a = Element a a
+ Argo.Internal.Codec.Array: type Element a b = Item (AccumT (Map Identifier Schema) Identity [(Maybe Identifier, Schema)]) Value a b
+ Argo.Internal.Codec.Codec: Codec :: r o -> (i -> w o) -> s -> Codec r w s i o
+ Argo.Internal.Codec.Codec: [decode] :: Codec r w s i o -> r o
+ Argo.Internal.Codec.Codec: [encode] :: Codec r w s i o -> i -> w o
+ Argo.Internal.Codec.Codec: [schema] :: Codec r w s i o -> s
+ Argo.Internal.Codec.Codec: data Codec r w s i o
+ Argo.Internal.Codec.Codec: instance (GHC.Base.Alternative r, GHC.Base.Alternative w, GHC.Base.Applicative s, GHC.Base.Monoid a) => GHC.Base.Alternative (Argo.Internal.Codec.Codec.Codec r w (s a) i)
+ Argo.Internal.Codec.Codec: instance (GHC.Base.Applicative r, GHC.Base.Applicative w, GHC.Base.Applicative s, GHC.Base.Monoid a) => GHC.Base.Applicative (Argo.Internal.Codec.Codec.Codec r w (s a) i)
+ Argo.Internal.Codec.Codec: instance (GHC.Base.Functor r, GHC.Base.Functor w) => GHC.Base.Functor (Argo.Internal.Codec.Codec.Codec r w s i)
+ Argo.Internal.Codec.Codec: map :: (Functor r, Functor w) => (a -> b) -> (b -> a) -> Codec r w s a a -> Codec r w s b b
+ Argo.Internal.Codec.Codec: mapMaybe :: (Alternative r, Alternative w, Monad r, Monad w) => (o2 -> Maybe o1) -> (i1 -> Maybe i2) -> Codec r w s i2 o2 -> Codec r w s i1 o1
+ Argo.Internal.Codec.Codec: project :: (i -> f) -> Codec r w s f o -> Codec r w s i o
+ Argo.Internal.Codec.Codec: tap :: Functor f => (a -> f b) -> a -> f a
+ Argo.Internal.Codec.Codec: toAlternative :: Alternative m => Maybe a -> m a
+ Argo.Internal.Codec.List: fromListCodec :: (Permission -> s -> AccumT (Map Identifier Schema) Identity (Maybe Identifier, Schema)) -> Value [e] -> Permission -> List s e a -> Value a
+ Argo.Internal.Codec.List: type Item s e a b = Codec (StateT [e] (ExceptT String Identity)) (WriterT [e] Identity) s a b
+ Argo.Internal.Codec.List: type List s e a = Item s e a a
+ Argo.Internal.Codec.Object: fromObjectCodec :: Permission -> Object a -> Value a
+ Argo.Internal.Codec.Object: optional :: Name -> Value a -> Object (Optional a)
+ Argo.Internal.Codec.Object: required :: Name -> Value a -> Object a
+ Argo.Internal.Codec.Object: tagged :: String -> Value a -> Value a
+ Argo.Internal.Codec.Object: type Member a b = Item (AccumT (Map Identifier Schema) Identity [((Name, Bool), (Maybe Identifier, Schema))]) (Member Value) a b
+ Argo.Internal.Codec.Object: type Object a = Member a a
+ Argo.Internal.Codec.Value: arrayCodec :: Value (Array Value)
+ Argo.Internal.Codec.Value: decodeWith :: Value a -> Value -> Either String a
+ Argo.Internal.Codec.Value: encodeWith :: Value a -> a -> Value
+ Argo.Internal.Codec.Value: getRef :: Value a -> AccumT (Map Identifier Schema) Identity Schema
+ Argo.Internal.Codec.Value: identified :: forall a. Typeable a => Value a -> Value a
+ Argo.Internal.Codec.Value: literalCodec :: Value -> Value ()
+ Argo.Internal.Codec.Value: objectCodec :: Value (Object Value)
+ Argo.Internal.Codec.Value: type Value a = Codec (ReaderT Value (ExceptT String Identity)) (MaybeT (StateT Value Identity)) (AccumT (Map Identifier Schema) Identity (Maybe Identifier, Schema)) a a
+ Argo.Internal.Codec.Value: typeName :: Typeable a => Proxy a -> String
+ Argo.Internal.Codec.Value: withIdentifier :: Identifier -> Value a -> Value a
+ Argo.Internal.Decode: decode :: HasCodec a => ByteString -> Either String a
+ Argo.Internal.Decode: decodePointer :: ByteString -> Either String Pointer
+ Argo.Internal.Decode: fromValue :: HasCodec a => Value -> Either String a
+ Argo.Internal.Encode: encode :: HasCodec a => a -> Builder
+ Argo.Internal.Encode: encodePointer :: Pointer -> Builder
+ Argo.Internal.Encode: encodeWith :: HasCodec a => Indent -> a -> Builder
+ Argo.Internal.Encode: toValue :: HasCodec a => a -> Value
+ Argo.Internal.Json.Array: Array :: [value] -> Array value
+ Argo.Internal.Json.Array: decode :: Decoder value -> Decoder (Array value)
+ Argo.Internal.Json.Array: encode :: (value -> Encoder ()) -> Array value -> Encoder ()
+ Argo.Internal.Json.Array: fromList :: [value] -> Array value
+ Argo.Internal.Json.Array: instance Control.DeepSeq.NFData value => Control.DeepSeq.NFData (Argo.Internal.Json.Array.Array value)
+ Argo.Internal.Json.Array: instance GHC.Classes.Eq value => GHC.Classes.Eq (Argo.Internal.Json.Array.Array value)
+ Argo.Internal.Json.Array: instance GHC.Generics.Generic (Argo.Internal.Json.Array.Array value)
+ Argo.Internal.Json.Array: instance GHC.Show.Show value => GHC.Show.Show (Argo.Internal.Json.Array.Array value)
+ Argo.Internal.Json.Array: instance Language.Haskell.TH.Syntax.Lift value => Language.Haskell.TH.Syntax.Lift (Argo.Internal.Json.Array.Array value)
+ Argo.Internal.Json.Array: newtype Array value
+ Argo.Internal.Json.Array: toList :: Array value -> [value]
+ Argo.Internal.Json.Boolean: Boolean :: Bool -> Boolean
+ Argo.Internal.Json.Boolean: decode :: Decoder Boolean
+ Argo.Internal.Json.Boolean: decodeFalse :: Decoder Boolean
+ Argo.Internal.Json.Boolean: decodeTrue :: Decoder Boolean
+ Argo.Internal.Json.Boolean: encode :: Boolean -> Encoder ()
+ Argo.Internal.Json.Boolean: fromBool :: Bool -> Boolean
+ Argo.Internal.Json.Boolean: instance Control.DeepSeq.NFData Argo.Internal.Json.Boolean.Boolean
+ Argo.Internal.Json.Boolean: instance GHC.Classes.Eq Argo.Internal.Json.Boolean.Boolean
+ Argo.Internal.Json.Boolean: instance GHC.Generics.Generic Argo.Internal.Json.Boolean.Boolean
+ Argo.Internal.Json.Boolean: instance GHC.Show.Show Argo.Internal.Json.Boolean.Boolean
+ Argo.Internal.Json.Boolean: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Json.Boolean.Boolean
+ Argo.Internal.Json.Boolean: newtype Boolean
+ Argo.Internal.Json.Boolean: toBool :: Boolean -> Bool
+ Argo.Internal.Json.Member: Member :: Name -> value -> Member value
+ Argo.Internal.Json.Member: data Member value
+ Argo.Internal.Json.Member: decode :: Decoder value -> Decoder (Member value)
+ Argo.Internal.Json.Member: encode :: (value -> Encoder ()) -> Member value -> Encoder ()
+ Argo.Internal.Json.Member: fromTuple :: (Name, value) -> Member value
+ Argo.Internal.Json.Member: instance Control.DeepSeq.NFData value => Control.DeepSeq.NFData (Argo.Internal.Json.Member.Member value)
+ Argo.Internal.Json.Member: instance GHC.Classes.Eq value => GHC.Classes.Eq (Argo.Internal.Json.Member.Member value)
+ Argo.Internal.Json.Member: instance GHC.Generics.Generic (Argo.Internal.Json.Member.Member value)
+ Argo.Internal.Json.Member: instance GHC.Show.Show value => GHC.Show.Show (Argo.Internal.Json.Member.Member value)
+ Argo.Internal.Json.Member: instance Language.Haskell.TH.Syntax.Lift value => Language.Haskell.TH.Syntax.Lift (Argo.Internal.Json.Member.Member value)
+ Argo.Internal.Json.Member: toTuple :: Member value -> (Name, value)
+ Argo.Internal.Json.Name: Name :: String -> Name
+ Argo.Internal.Json.Name: decode :: Decoder Name
+ Argo.Internal.Json.Name: encode :: Name -> Encoder ()
+ Argo.Internal.Json.Name: fromString :: String -> Name
+ Argo.Internal.Json.Name: instance Control.DeepSeq.NFData Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: instance Data.String.IsString Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: instance GHC.Classes.Eq Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: instance GHC.Classes.Ord Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: instance GHC.Generics.Generic Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: instance GHC.Show.Show Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Json.Name.Name
+ Argo.Internal.Json.Name: newtype Name
+ Argo.Internal.Json.Name: toString :: Name -> String
+ Argo.Internal.Json.Null: Null :: () -> Null
+ Argo.Internal.Json.Null: decode :: Decoder Null
+ Argo.Internal.Json.Null: encode :: Null -> Encoder ()
+ Argo.Internal.Json.Null: fromUnit :: () -> Null
+ Argo.Internal.Json.Null: instance Control.DeepSeq.NFData Argo.Internal.Json.Null.Null
+ Argo.Internal.Json.Null: instance GHC.Classes.Eq Argo.Internal.Json.Null.Null
+ Argo.Internal.Json.Null: instance GHC.Generics.Generic Argo.Internal.Json.Null.Null
+ Argo.Internal.Json.Null: instance GHC.Show.Show Argo.Internal.Json.Null.Null
+ Argo.Internal.Json.Null: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Json.Null.Null
+ Argo.Internal.Json.Null: newtype Null
+ Argo.Internal.Json.Null: toUnit :: Null -> ()
+ Argo.Internal.Json.Number: Number :: Decimal -> Number
+ Argo.Internal.Json.Number: decode :: Decoder Number
+ Argo.Internal.Json.Number: encode :: Number -> Encoder ()
+ Argo.Internal.Json.Number: fromDecimal :: Decimal -> Number
+ Argo.Internal.Json.Number: fromDigits :: ByteString -> Integer
+ Argo.Internal.Json.Number: instance Control.DeepSeq.NFData Argo.Internal.Json.Number.Number
+ Argo.Internal.Json.Number: instance GHC.Classes.Eq Argo.Internal.Json.Number.Number
+ Argo.Internal.Json.Number: instance GHC.Generics.Generic Argo.Internal.Json.Number.Number
+ Argo.Internal.Json.Number: instance GHC.Show.Show Argo.Internal.Json.Number.Number
+ Argo.Internal.Json.Number: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Json.Number.Number
+ Argo.Internal.Json.Number: intToInteger :: Int -> Integer
+ Argo.Internal.Json.Number: negateIf :: Bool -> Integer -> Integer
+ Argo.Internal.Json.Number: newtype Number
+ Argo.Internal.Json.Number: toDecimal :: Number -> Decimal
+ Argo.Internal.Json.Number: word8ToInteger :: Word8 -> Integer
+ Argo.Internal.Json.Object: Object :: [Member value] -> Object value
+ Argo.Internal.Json.Object: decode :: Decoder value -> Decoder (Object value)
+ Argo.Internal.Json.Object: encode :: (value -> Encoder ()) -> Object value -> Encoder ()
+ Argo.Internal.Json.Object: encodeElement :: (value -> Encoder ()) -> Int -> Member value -> Encoder ()
+ Argo.Internal.Json.Object: fromList :: [Member value] -> Object value
+ Argo.Internal.Json.Object: instance Control.DeepSeq.NFData value => Control.DeepSeq.NFData (Argo.Internal.Json.Object.Object value)
+ Argo.Internal.Json.Object: instance GHC.Classes.Eq value => GHC.Classes.Eq (Argo.Internal.Json.Object.Object value)
+ Argo.Internal.Json.Object: instance GHC.Generics.Generic (Argo.Internal.Json.Object.Object value)
+ Argo.Internal.Json.Object: instance GHC.Show.Show value => GHC.Show.Show (Argo.Internal.Json.Object.Object value)
+ Argo.Internal.Json.Object: instance Language.Haskell.TH.Syntax.Lift value => Language.Haskell.TH.Syntax.Lift (Argo.Internal.Json.Object.Object value)
+ Argo.Internal.Json.Object: newtype Object value
+ Argo.Internal.Json.Object: toList :: Object value -> [Member value]
+ Argo.Internal.Json.String: String :: Text -> String
+ Argo.Internal.Json.String: combineSurrogatePair :: Char -> Char -> Char
+ Argo.Internal.Json.String: combineSurrogatePairs :: String -> String
+ Argo.Internal.Json.String: countConsecutive :: Word8 -> Int -> ByteString -> Int
+ Argo.Internal.Json.String: decode :: Decoder String
+ Argo.Internal.Json.String: encode :: String -> Encoder ()
+ Argo.Internal.Json.String: encodeChar :: BoundedPrim Word8
+ Argo.Internal.Json.String: encodeLongEscape :: BoundedPrim Word8
+ Argo.Internal.Json.String: encodeShortEscape :: Word8 -> BoundedPrim a
+ Argo.Internal.Json.String: findAt :: Word8 -> Int -> ByteString -> Maybe Int
+ Argo.Internal.Json.String: fromHexadecimalDigit :: Char -> Maybe Int
+ Argo.Internal.Json.String: fromLongEscape :: Char -> Char -> Char -> Char -> Maybe Char
+ Argo.Internal.Json.String: fromText :: Text -> String
+ Argo.Internal.Json.String: getClose :: ByteString -> Int -> Maybe Int
+ Argo.Internal.Json.String: instance Control.DeepSeq.NFData Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: instance Data.String.IsString Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: instance GHC.Classes.Eq Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: instance GHC.Classes.Ord Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: instance GHC.Generics.Generic Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: instance GHC.Show.Show Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Json.String.String
+ Argo.Internal.Json.String: isHighSurrogate :: Char -> Bool
+ Argo.Internal.Json.String: isLowSurrogate :: Char -> Bool
+ Argo.Internal.Json.String: newtype String
+ Argo.Internal.Json.String: toText :: String -> Text
+ Argo.Internal.Json.String: unescapeString :: String -> Either String String
+ Argo.Internal.Json.String: unescapeText :: Text -> Either String Text
+ Argo.Internal.Json.String: word8ToWord16 :: Word8 -> Word16
+ Argo.Internal.Json.Value: Array :: Array Value -> Value
+ Argo.Internal.Json.Value: Boolean :: Boolean -> Value
+ Argo.Internal.Json.Value: Null :: Null -> Value
+ Argo.Internal.Json.Value: Number :: Number -> Value
+ Argo.Internal.Json.Value: Object :: Object Value -> Value
+ Argo.Internal.Json.Value: String :: String -> Value
+ Argo.Internal.Json.Value: data Value
+ Argo.Internal.Json.Value: decode :: Decoder Value
+ Argo.Internal.Json.Value: encode :: Value -> Encoder ()
+ Argo.Internal.Json.Value: instance Control.DeepSeq.NFData Argo.Internal.Json.Value.Value
+ Argo.Internal.Json.Value: instance Data.String.IsString Argo.Internal.Json.Value.Value
+ Argo.Internal.Json.Value: instance GHC.Classes.Eq Argo.Internal.Json.Value.Value
+ Argo.Internal.Json.Value: instance GHC.Generics.Generic Argo.Internal.Json.Value.Value
+ Argo.Internal.Json.Value: instance GHC.Show.Show Argo.Internal.Json.Value.Value
+ Argo.Internal.Json.Value: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Json.Value.Value
+ Argo.Internal.Literal: backspace :: Word8
+ Argo.Internal.Literal: carriageReturn :: Word8
+ Argo.Internal.Literal: colon :: Word8
+ Argo.Internal.Literal: comma :: Word8
+ Argo.Internal.Literal: digitNine :: Word8
+ Argo.Internal.Literal: digitOne :: Word8
+ Argo.Internal.Literal: digitZero :: Word8
+ Argo.Internal.Literal: false :: ByteString
+ Argo.Internal.Literal: formFeed :: Word8
+ Argo.Internal.Literal: fullStop :: Word8
+ Argo.Internal.Literal: horizontalTabulation :: Word8
+ Argo.Internal.Literal: hyphenMinus :: Word8
+ Argo.Internal.Literal: latinCapitalLetterE :: Word8
+ Argo.Internal.Literal: latinSmallLetterB :: Word8
+ Argo.Internal.Literal: latinSmallLetterE :: Word8
+ Argo.Internal.Literal: latinSmallLetterF :: Word8
+ Argo.Internal.Literal: latinSmallLetterN :: Word8
+ Argo.Internal.Literal: latinSmallLetterR :: Word8
+ Argo.Internal.Literal: latinSmallLetterT :: Word8
+ Argo.Internal.Literal: latinSmallLetterU :: Word8
+ Argo.Internal.Literal: leftCurlyBracket :: Word8
+ Argo.Internal.Literal: leftSquareBracket :: Word8
+ Argo.Internal.Literal: newLine :: Word8
+ Argo.Internal.Literal: null :: ByteString
+ Argo.Internal.Literal: plusSign :: Word8
+ Argo.Internal.Literal: quotationMark :: Word8
+ Argo.Internal.Literal: reverseSolidus :: Word8
+ Argo.Internal.Literal: rightCurlyBracket :: Word8
+ Argo.Internal.Literal: rightSquareBracket :: Word8
+ Argo.Internal.Literal: solidus :: Word8
+ Argo.Internal.Literal: space :: Word8
+ Argo.Internal.Literal: tilde :: Word8
+ Argo.Internal.Literal: true :: ByteString
+ Argo.Internal.Main: getFlags :: [String] -> (([String], [String]), [Flag])
+ Argo.Internal.Main: main :: IO ()
+ Argo.Internal.Main: mainWith :: String -> [String] -> IO ()
+ Argo.Internal.Main: options :: [OptDescr Flag]
+ Argo.Internal.Main: quote :: String -> String
+ Argo.Internal.Main: version :: String
+ Argo.Internal.Main: withSettings :: String -> [Flag] -> (Settings -> IO ()) -> IO ()
+ Argo.Internal.Pattern: pattern Array :: [Value] -> Value
+ Argo.Internal.Pattern: pattern Boolean :: Bool -> Value
+ Argo.Internal.Pattern: pattern Decimal :: Integer -> Integer -> Decimal
+ Argo.Internal.Pattern: pattern Name :: Text -> Name
+ Argo.Internal.Pattern: pattern Null :: Value
+ Argo.Internal.Pattern: pattern Number :: Decimal -> Value
+ Argo.Internal.Pattern: pattern Object :: [Member Value] -> Value
+ Argo.Internal.Pattern: pattern String :: Text -> Value
+ Argo.Internal.Pointer.Pointer: Pointer :: [Token] -> Pointer
+ Argo.Internal.Pointer.Pointer: atIndex :: Token -> Array value -> Either String value
+ Argo.Internal.Pointer.Pointer: atKey :: Token -> Object value -> Either String value
+ Argo.Internal.Pointer.Pointer: decode :: Decoder Pointer
+ Argo.Internal.Pointer.Pointer: decodeToken :: Decoder Token
+ Argo.Internal.Pointer.Pointer: encode :: Pointer -> Encoder ()
+ Argo.Internal.Pointer.Pointer: encodeToken :: Token -> Encoder ()
+ Argo.Internal.Pointer.Pointer: evaluate :: Pointer -> Value -> Either String Value
+ Argo.Internal.Pointer.Pointer: fromList :: [Token] -> Pointer
+ Argo.Internal.Pointer.Pointer: instance Control.DeepSeq.NFData Argo.Internal.Pointer.Pointer.Pointer
+ Argo.Internal.Pointer.Pointer: instance GHC.Classes.Eq Argo.Internal.Pointer.Pointer.Pointer
+ Argo.Internal.Pointer.Pointer: instance GHC.Generics.Generic Argo.Internal.Pointer.Pointer.Pointer
+ Argo.Internal.Pointer.Pointer: instance GHC.Show.Show Argo.Internal.Pointer.Pointer.Pointer
+ Argo.Internal.Pointer.Pointer: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Pointer.Pointer.Pointer
+ Argo.Internal.Pointer.Pointer: newtype Pointer
+ Argo.Internal.Pointer.Pointer: toList :: Pointer -> [Token]
+ Argo.Internal.Pointer.Pointer: tokenToIndex :: Token -> Either String Int
+ Argo.Internal.Pointer.Token: Token :: Text -> Token
+ Argo.Internal.Pointer.Token: decode :: Decoder Token
+ Argo.Internal.Pointer.Token: encode :: Token -> Encoder ()
+ Argo.Internal.Pointer.Token: encodeChar :: BoundedPrim Word8
+ Argo.Internal.Pointer.Token: encodeEscape :: Word8 -> BoundedPrim a
+ Argo.Internal.Pointer.Token: fromText :: Text -> Token
+ Argo.Internal.Pointer.Token: instance Control.DeepSeq.NFData Argo.Internal.Pointer.Token.Token
+ Argo.Internal.Pointer.Token: instance Data.String.IsString Argo.Internal.Pointer.Token.Token
+ Argo.Internal.Pointer.Token: instance GHC.Classes.Eq Argo.Internal.Pointer.Token.Token
+ Argo.Internal.Pointer.Token: instance GHC.Generics.Generic Argo.Internal.Pointer.Token.Token
+ Argo.Internal.Pointer.Token: instance GHC.Show.Show Argo.Internal.Pointer.Token.Token
+ Argo.Internal.Pointer.Token: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Pointer.Token.Token
+ Argo.Internal.Pointer.Token: newtype Token
+ Argo.Internal.Pointer.Token: toText :: Token -> Text
+ Argo.Internal.Pointer.Token: unescape :: ByteString -> Either String ByteString
+ Argo.Internal.Pointer.Token: unescapeHelper :: [Word8] -> Either String [Word8]
+ Argo.Internal.QuasiQuoter: asValue :: Value -> Value
+ Argo.Internal.QuasiQuoter: defaultQuasiQuoter :: QuasiQuoter
+ Argo.Internal.QuasiQuoter: pointer :: QuasiQuoter
+ Argo.Internal.QuasiQuoter: value :: QuasiQuoter
+ Argo.Internal.Schema.Identifier: Identifier :: Text -> Identifier
+ Argo.Internal.Schema.Identifier: fromText :: Text -> Identifier
+ Argo.Internal.Schema.Identifier: instance Control.DeepSeq.NFData Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance Data.String.IsString Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance GHC.Base.Semigroup Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance GHC.Classes.Eq Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance GHC.Classes.Ord Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance GHC.Generics.Generic Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance GHC.Show.Show Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Schema.Identifier.Identifier
+ Argo.Internal.Schema.Identifier: newtype Identifier
+ Argo.Internal.Schema.Identifier: toText :: Identifier -> Text
+ Argo.Internal.Schema.Schema: Array :: Maybe Natural -> Maybe Natural -> Either Schema (NonEmpty Schema) -> Maybe Schema -> Schema
+ Argo.Internal.Schema.Schema: Boolean :: Schema
+ Argo.Internal.Schema.Schema: Const :: Value -> Schema
+ Argo.Internal.Schema.Schema: False :: Schema
+ Argo.Internal.Schema.Schema: Integer :: Maybe Integer -> Maybe Integer -> Schema
+ Argo.Internal.Schema.Schema: Null :: Schema
+ Argo.Internal.Schema.Schema: Number :: Schema
+ Argo.Internal.Schema.Schema: Object :: [(Name, Schema)] -> [Name] -> Maybe Schema -> Schema
+ Argo.Internal.Schema.Schema: OneOf :: [Schema] -> Schema
+ Argo.Internal.Schema.Schema: Ref :: Identifier -> Schema
+ Argo.Internal.Schema.Schema: String :: Maybe Natural -> Maybe Natural -> Schema
+ Argo.Internal.Schema.Schema: True :: Schema
+ Argo.Internal.Schema.Schema: data Schema
+ Argo.Internal.Schema.Schema: false :: Schema
+ Argo.Internal.Schema.Schema: instance Control.DeepSeq.NFData Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: instance GHC.Base.Monoid Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: instance GHC.Base.Semigroup Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: instance GHC.Classes.Eq Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: instance GHC.Generics.Generic Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: instance GHC.Show.Show Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Schema.Schema.Schema
+ Argo.Internal.Schema.Schema: maybeRef :: (Maybe Identifier, Schema) -> Schema
+ Argo.Internal.Schema.Schema: member :: String -> a -> Member a
+ Argo.Internal.Schema.Schema: true :: Schema
+ Argo.Internal.Schema.Schema: unidentified :: Schema -> (Maybe Identifier, Schema)
+ Argo.Internal.Schema.Schema: withIdentifier :: Identifier -> Schema -> (Maybe Identifier, Schema)
+ Argo.Internal.Type.Config: Config :: Indent -> Int -> Config
+ Argo.Internal.Type.Config: [indent] :: Config -> Indent
+ Argo.Internal.Type.Config: [level] :: Config -> Int
+ Argo.Internal.Type.Config: data Config
+ Argo.Internal.Type.Config: hasIndent :: Config -> Bool
+ Argo.Internal.Type.Config: increaseLevel :: Config -> Config
+ Argo.Internal.Type.Config: initial :: Config
+ Argo.Internal.Type.Config: instance GHC.Classes.Eq Argo.Internal.Type.Config.Config
+ Argo.Internal.Type.Config: instance GHC.Show.Show Argo.Internal.Type.Config.Config
+ Argo.Internal.Type.Decimal: Decimal :: Integer -> Integer -> Decimal
+ Argo.Internal.Type.Decimal: data Decimal
+ Argo.Internal.Type.Decimal: decimal :: Integer -> Integer -> Decimal
+ Argo.Internal.Type.Decimal: factor :: (Num a, Integral b) => b -> a -> b -> (a, b)
+ Argo.Internal.Type.Decimal: fromDigits :: [Int] -> Int -> Decimal
+ Argo.Internal.Type.Decimal: fromInteger :: Integer -> Decimal
+ Argo.Internal.Type.Decimal: fromRational :: Rational -> Maybe Decimal
+ Argo.Internal.Type.Decimal: fromRealFloat :: RealFloat a => a -> Maybe Decimal
+ Argo.Internal.Type.Decimal: instance Control.DeepSeq.NFData Argo.Internal.Type.Decimal.Decimal
+ Argo.Internal.Type.Decimal: instance GHC.Classes.Eq Argo.Internal.Type.Decimal.Decimal
+ Argo.Internal.Type.Decimal: instance GHC.Generics.Generic Argo.Internal.Type.Decimal.Decimal
+ Argo.Internal.Type.Decimal: instance GHC.Show.Show Argo.Internal.Type.Decimal.Decimal
+ Argo.Internal.Type.Decimal: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Type.Decimal.Decimal
+ Argo.Internal.Type.Decimal: negate :: Decimal -> Decimal
+ Argo.Internal.Type.Decimal: normalize :: Decimal -> Decimal
+ Argo.Internal.Type.Decimal: toInteger :: Decimal -> Maybe Integer
+ Argo.Internal.Type.Decimal: toRational :: Decimal -> Rational
+ Argo.Internal.Type.Decimal: toRealFloat :: RealFloat a => Decimal -> a
+ Argo.Internal.Type.Decoder: byteString :: ByteString -> Decoder ()
+ Argo.Internal.Type.Decoder: dropWhile :: (Word8 -> Bool) -> Decoder ()
+ Argo.Internal.Type.Decoder: eof :: Decoder ()
+ Argo.Internal.Type.Decoder: isDigit :: Word8 -> Bool
+ Argo.Internal.Type.Decoder: isSpace :: Word8 -> Bool
+ Argo.Internal.Type.Decoder: list :: Decoder a -> Decoder [a]
+ Argo.Internal.Type.Decoder: listWith :: Decoder a -> [a] -> Decoder [a]
+ Argo.Internal.Type.Decoder: run :: Decoder a -> ByteString -> Either String a
+ Argo.Internal.Type.Decoder: satisfy :: (Word8 -> Bool) -> Decoder Word8
+ Argo.Internal.Type.Decoder: spaces :: Decoder ()
+ Argo.Internal.Type.Decoder: takeWhile :: (Word8 -> Bool) -> Decoder ByteString
+ Argo.Internal.Type.Decoder: takeWhile1 :: (Word8 -> Bool) -> Decoder ByteString
+ Argo.Internal.Type.Decoder: type Decoder = StateT ByteString (ExceptT String Identity)
+ Argo.Internal.Type.Decoder: unwrap :: Decoder a -> ByteString -> Either String (a, ByteString)
+ Argo.Internal.Type.Decoder: word8 :: Word8 -> Decoder ()
+ Argo.Internal.Type.Encoder: list :: Encoder () -> Encoder () -> Encoder () -> (a -> Encoder ()) -> [a] -> Encoder ()
+ Argo.Internal.Type.Encoder: makeIndent :: Config -> Maybe Builder
+ Argo.Internal.Type.Encoder: run :: Config -> Encoder a -> Builder
+ Argo.Internal.Type.Encoder: type Encoder = ReaderT Config (WriterT Builder Identity)
+ Argo.Internal.Type.Encoder: unwrap :: Config -> Encoder a -> (a, Builder)
+ Argo.Internal.Type.Encoder: withNewLine :: Maybe Builder -> Encoder ()
+ Argo.Internal.Type.Flag: Help :: Flag
+ Argo.Internal.Type.Flag: Spaces :: String -> Flag
+ Argo.Internal.Type.Flag: Tab :: Flag
+ Argo.Internal.Type.Flag: Version :: Flag
+ Argo.Internal.Type.Flag: data Flag
+ Argo.Internal.Type.Flag: instance GHC.Classes.Eq Argo.Internal.Type.Flag.Flag
+ Argo.Internal.Type.Flag: instance GHC.Show.Show Argo.Internal.Type.Flag.Flag
+ Argo.Internal.Type.Indent: Spaces :: Int -> Indent
+ Argo.Internal.Type.Indent: Tab :: Indent
+ Argo.Internal.Type.Indent: data Indent
+ Argo.Internal.Type.Indent: instance GHC.Classes.Eq Argo.Internal.Type.Indent.Indent
+ Argo.Internal.Type.Indent: instance GHC.Show.Show Argo.Internal.Type.Indent.Indent
+ Argo.Internal.Type.Nullable: Nullable :: Maybe a -> Nullable a
+ Argo.Internal.Type.Nullable: fromMaybe :: Maybe a -> Nullable a
+ Argo.Internal.Type.Nullable: instance GHC.Classes.Eq a => GHC.Classes.Eq (Argo.Internal.Type.Nullable.Nullable a)
+ Argo.Internal.Type.Nullable: instance GHC.Show.Show a => GHC.Show.Show (Argo.Internal.Type.Nullable.Nullable a)
+ Argo.Internal.Type.Nullable: just :: a -> Nullable a
+ Argo.Internal.Type.Nullable: newtype Nullable a
+ Argo.Internal.Type.Nullable: nothing :: Nullable a
+ Argo.Internal.Type.Nullable: toMaybe :: Nullable a -> Maybe a
+ Argo.Internal.Type.Optional: Optional :: Maybe a -> Optional a
+ Argo.Internal.Type.Optional: fromMaybe :: Maybe a -> Optional a
+ Argo.Internal.Type.Optional: instance GHC.Classes.Eq a => GHC.Classes.Eq (Argo.Internal.Type.Optional.Optional a)
+ Argo.Internal.Type.Optional: instance GHC.Show.Show a => GHC.Show.Show (Argo.Internal.Type.Optional.Optional a)
+ Argo.Internal.Type.Optional: just :: a -> Optional a
+ Argo.Internal.Type.Optional: newtype Optional a
+ Argo.Internal.Type.Optional: nothing :: Optional a
+ Argo.Internal.Type.Optional: toMaybe :: Optional a -> Maybe a
+ Argo.Internal.Type.Permission: Allow :: Permission
+ Argo.Internal.Type.Permission: Forbid :: Permission
+ Argo.Internal.Type.Permission: data Permission
+ Argo.Internal.Type.Permission: instance Control.DeepSeq.NFData Argo.Internal.Type.Permission.Permission
+ Argo.Internal.Type.Permission: instance GHC.Classes.Eq Argo.Internal.Type.Permission.Permission
+ Argo.Internal.Type.Permission: instance GHC.Generics.Generic Argo.Internal.Type.Permission.Permission
+ Argo.Internal.Type.Permission: instance GHC.Show.Show Argo.Internal.Type.Permission.Permission
+ Argo.Internal.Type.Permission: instance Language.Haskell.TH.Syntax.Lift Argo.Internal.Type.Permission.Permission
+ Argo.Internal.Type.Permission: toBool :: Permission -> Bool
+ Argo.Internal.Type.Settings: Settings :: Bool -> Indent -> Bool -> Settings
+ Argo.Internal.Type.Settings: [help] :: Settings -> Bool
+ Argo.Internal.Type.Settings: [indent] :: Settings -> Indent
+ Argo.Internal.Type.Settings: [version] :: Settings -> Bool
+ Argo.Internal.Type.Settings: applyFlag :: Settings -> Flag -> Either String Settings
+ Argo.Internal.Type.Settings: data Settings
+ Argo.Internal.Type.Settings: initial :: Settings
+ Argo.Internal.Type.Settings: instance GHC.Classes.Eq Argo.Internal.Type.Settings.Settings
+ Argo.Internal.Type.Settings: instance GHC.Show.Show Argo.Internal.Type.Settings.Settings
Files
- argo.cabal +36/−36
- source/executable/Main.hs +1/−1
- source/library/Argo.hs +73/−22
- source/library/Argo/Class/HasCodec.hs +0/−818
- source/library/Argo/Codec/Array.hs +0/−61
- source/library/Argo/Codec/Codec.hs +0/−92
- source/library/Argo/Codec/List.hs +0/−57
- source/library/Argo/Codec/Object.hs +0/−116
- source/library/Argo/Codec/Value.hs +0/−124
- source/library/Argo/Decode.hs +0/−16
- source/library/Argo/Encode.hs +0/−30
- source/library/Argo/Internal/Class/HasCodec.hs +818/−0
- source/library/Argo/Internal/Codec/Array.hs +64/−0
- source/library/Argo/Internal/Codec/Codec.hs +92/−0
- source/library/Argo/Internal/Codec/List.hs +59/−0
- source/library/Argo/Internal/Codec/Object.hs +119/−0
- source/library/Argo/Internal/Codec/Value.hs +124/−0
- source/library/Argo/Internal/Decode.hs +19/−0
- source/library/Argo/Internal/Encode.hs +33/−0
- source/library/Argo/Internal/Json/Array.hs +43/−0
- source/library/Argo/Internal/Json/Boolean.hs +42/−0
- source/library/Argo/Internal/Json/Member.hs +45/−0
- source/library/Argo/Internal/Json/Name.hs +32/−0
- source/library/Argo/Internal/Json/Null.hs +30/−0
- source/library/Argo/Internal/Json/Number.hs +92/−0
- source/library/Argo/Internal/Json/Object.hs +53/−0
- source/library/Argo/Internal/Json/String.hs +179/−0
- source/library/Argo/Internal/Json/Value.hs +52/−0
- source/library/Argo/Internal/Literal.hs +103/−0
- source/library/Argo/Internal/Main.hs +88/−0
- source/library/Argo/Internal/Pattern.hs +46/−0
- source/library/Argo/Internal/Pointer/Pointer.hs +87/−0
- source/library/Argo/Internal/Pointer/Token.hs +72/−0
- source/library/Argo/Internal/QuasiQuoter.hs +35/−0
- source/library/Argo/Internal/Schema/Identifier.hs +27/−0
- source/library/Argo/Internal/Schema/Schema.hs +68/−0
- source/library/Argo/Internal/Type/Config.hs +20/−0
- source/library/Argo/Internal/Type/Decimal.hs +77/−0
- source/library/Argo/Internal/Type/Decoder.hs +92/−0
- source/library/Argo/Internal/Type/Encoder.hs +61/−0
- source/library/Argo/Internal/Type/Flag.hs +8/−0
- source/library/Argo/Internal/Type/Indent.hs +6/−0
- source/library/Argo/Internal/Type/Nullable.hs +17/−0
- source/library/Argo/Internal/Type/Optional.hs +17/−0
- source/library/Argo/Internal/Type/Permission.hs +19/−0
- source/library/Argo/Internal/Type/Settings.hs +24/−0
- source/library/Argo/Json/Array.hs +0/−43
- source/library/Argo/Json/Boolean.hs +0/−42
- source/library/Argo/Json/Member.hs +0/−45
- source/library/Argo/Json/Name.hs +0/−32
- source/library/Argo/Json/Null.hs +0/−30
- source/library/Argo/Json/Number.hs +0/−92
- source/library/Argo/Json/Object.hs +0/−53
- source/library/Argo/Json/String.hs +0/−179
- source/library/Argo/Json/Value.hs +0/−52
- source/library/Argo/Literal.hs +0/−103
- source/library/Argo/Main.hs +0/−86
- source/library/Argo/Pattern.hs +0/−46
- source/library/Argo/Pointer/Pointer.hs +0/−87
- source/library/Argo/Pointer/Token.hs +0/−72
- source/library/Argo/QuasiQuoter.hs +0/−35
- source/library/Argo/Schema/Identifier.hs +0/−27
- source/library/Argo/Schema/Schema.hs +0/−68
- source/library/Argo/Type/Config.hs +0/−20
- source/library/Argo/Type/Decimal.hs +0/−77
- source/library/Argo/Type/Decoder.hs +0/−92
- source/library/Argo/Type/Encoder.hs +0/−61
- source/library/Argo/Type/Flag.hs +0/−8
- source/library/Argo/Type/Indent.hs +0/−6
- source/library/Argo/Type/Nullable.hs +0/−17
- source/library/Argo/Type/Optional.hs +0/−17
- source/library/Argo/Type/Permission.hs +0/−19
- source/library/Argo/Type/Settings.hs +0/−24
- source/test-suite/Main.hs +17/−17
argo.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: argo-version: 0.2022.2.23+version: 0.2022.2.27 build-type: Simple category: JSON@@ -67,41 +67,41 @@ autogen-modules: Paths_argo exposed-modules: Argo- Argo.Class.HasCodec- Argo.Codec.Array- Argo.Codec.Codec- Argo.Codec.List- Argo.Codec.Object- Argo.Codec.Value- Argo.Decode- Argo.Encode- Argo.Json.Array- Argo.Json.Boolean- Argo.Json.Member- Argo.Json.Name- Argo.Json.Null- Argo.Json.Number- Argo.Json.Object- Argo.Json.String- Argo.Json.Value- Argo.Literal- Argo.Main- Argo.Pattern- Argo.Pointer.Pointer- Argo.Pointer.Token- Argo.QuasiQuoter- Argo.Schema.Identifier- Argo.Schema.Schema- Argo.Type.Config- Argo.Type.Decimal- Argo.Type.Decoder- Argo.Type.Encoder- Argo.Type.Flag- Argo.Type.Indent- Argo.Type.Nullable- Argo.Type.Optional- Argo.Type.Permission- Argo.Type.Settings+ Argo.Internal.Class.HasCodec+ Argo.Internal.Codec.Array+ Argo.Internal.Codec.Codec+ Argo.Internal.Codec.List+ Argo.Internal.Codec.Object+ Argo.Internal.Codec.Value+ Argo.Internal.Decode+ Argo.Internal.Encode+ Argo.Internal.Json.Array+ Argo.Internal.Json.Boolean+ Argo.Internal.Json.Member+ Argo.Internal.Json.Name+ Argo.Internal.Json.Null+ Argo.Internal.Json.Number+ Argo.Internal.Json.Object+ Argo.Internal.Json.String+ Argo.Internal.Json.Value+ Argo.Internal.Literal+ Argo.Internal.Main+ Argo.Internal.Pattern+ Argo.Internal.Pointer.Pointer+ Argo.Internal.Pointer.Token+ Argo.Internal.QuasiQuoter+ Argo.Internal.Schema.Identifier+ Argo.Internal.Schema.Schema+ Argo.Internal.Type.Config+ Argo.Internal.Type.Decimal+ Argo.Internal.Type.Decoder+ Argo.Internal.Type.Encoder+ Argo.Internal.Type.Flag+ Argo.Internal.Type.Indent+ Argo.Internal.Type.Nullable+ Argo.Internal.Type.Optional+ Argo.Internal.Type.Permission+ Argo.Internal.Type.Settings hs-source-dirs: source/library other-modules: Argo.Vendor.Builder
source/executable/Main.hs view
@@ -1,4 +1,4 @@-import qualified Argo.Main as Argo+import qualified Argo.Internal.Main as Argo main :: IO () main = Argo.main
source/library/Argo.hs view
@@ -7,34 +7,85 @@ , Pattern.Object , Pattern.String )- , Name.Name(Pattern.Name)- , Member.Member(Member)+ -- * Decoding+ , Decode.decode+ , Decode.decodePointer+ , Decode.fromValue+ -- * Encoding , Encode.encode , Encode.encodeWith- , Indent.Indent(Spaces, Tab)- , Decode.decode+ , Encode.encodePointer+ , Encode.toValue+ -- * Codecs , HasCodec.HasCodec(codec)+ , Codec.identified+ , Codec.withIdentifier+ , Codec.map+ , Codec.mapMaybe+ , Codec.project+ -- ** Arrays+ , Codec.fromArrayCodec+ , element+ -- ** Objects+ , Codec.fromObjectCodec+ , required+ , optional+ -- * Schemas+ , Codec.schema+ , oneOf+ -- * Pointers+ , Pointer.evaluate+ -- * Quasi Quoters , QuasiQuoter.value , QuasiQuoter.pointer- , Pointer.Pointer(Pointer)- , Token.Token(Token)- , Pointer.evaluate- , Encode.encodePointer- , Decode.decodePointer+ -- * Types+ , Codec , Decimal.Decimal(Pattern.Decimal)+ , Identifier.Identifier(Identifier.Identifier)+ , Indent.Indent(Indent.Spaces, Indent.Tab)+ , Member.Member(Member.Member)+ , Name.Name(Pattern.Name)+ , Permission.Permission(Permission.Allow, Permission.Forbid)+ , Pointer.Pointer(Pointer.Pointer) , Schema.Schema+ , Token.Token(Token.Token) ) where -import qualified Argo.Class.HasCodec as HasCodec-import qualified Argo.Decode as Decode-import qualified Argo.Encode as Encode-import qualified Argo.Json.Member as Member-import qualified Argo.Json.Name as Name-import qualified Argo.Json.Value as Value-import qualified Argo.Pattern as Pattern-import qualified Argo.Pointer.Pointer as Pointer-import qualified Argo.Pointer.Token as Token-import qualified Argo.QuasiQuoter as QuasiQuoter-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Type.Decimal as Decimal-import qualified Argo.Type.Indent as Indent+import qualified Argo.Internal.Class.HasCodec as HasCodec+import qualified Argo.Internal.Codec.Array as Codec+import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Codec.Object as Codec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Decode as Decode+import qualified Argo.Internal.Encode as Encode+import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Pattern as Pattern+import qualified Argo.Internal.Pointer.Pointer as Pointer+import qualified Argo.Internal.Pointer.Token as Token+import qualified Argo.Internal.QuasiQuoter as QuasiQuoter+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Internal.Type.Decimal as Decimal+import qualified Argo.Internal.Type.Indent as Indent+import qualified Argo.Internal.Type.Permission as Permission+import qualified Data.Foldable as Foldable++type Codec a = Codec.Value a++element :: HasCodec.HasCodec o => (i -> o) -> Codec.Element i o+element f = Codec.project f $ Codec.element HasCodec.codec++oneOf :: Foldable t => t Schema.Schema -> Schema.Schema+oneOf = Foldable.fold++optional+ :: HasCodec.HasCodec f+ => (i -> Maybe f)+ -> Name.Name+ -> Codec.Member i (Maybe f)+optional f k = Codec.project f $ HasCodec.optionalNullable k HasCodec.codec++required :: HasCodec.HasCodec f => (i -> f) -> Name.Name -> Codec.Member i f+required f k = Codec.project f $ Codec.required k HasCodec.codec
− source/library/Argo/Class/HasCodec.hs
@@ -1,818 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE ScopedTypeVariables #-}--module Argo.Class.HasCodec where--import Control.Applicative ((<|>))--import qualified Argo.Codec.Array as Codec-import qualified Argo.Codec.Codec as Codec-import qualified Argo.Codec.Object as Codec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Json.Array as Array-import qualified Argo.Json.Boolean as Boolean-import qualified Argo.Json.Member as Member-import qualified Argo.Json.Name as Name-import qualified Argo.Json.Null as Null-import qualified Argo.Json.Number as Number-import qualified Argo.Json.Object as Object-import qualified Argo.Json.String as String-import qualified Argo.Json.Value as Value-import qualified Argo.Pointer.Pointer as Pointer-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Type.Config as Config-import qualified Argo.Type.Decimal as Decimal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Type.Nullable as Nullable-import qualified Argo.Type.Optional as Optional-import qualified Argo.Type.Permission as Permission-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.ByteString as ByteString-import qualified Argo.Vendor.Map as Map-import qualified Argo.Vendor.Text as Text-import qualified Argo.Vendor.Transformers as Trans-import qualified Data.Bits as Bits-import qualified Data.Functor.Identity as Identity-import qualified Data.Int as Int-import qualified Data.List.NonEmpty as NonEmpty-import qualified Data.Maybe as Maybe-import qualified Data.Typeable as Typeable-import qualified Data.Word as Word-import qualified Numeric.Natural as Natural--class Typeable.Typeable a => HasCodec a where- codec :: Codec.Value a--instance HasCodec Value.Value where- codec = valueCodec Schema.true id Just--instance HasCodec Null.Null where- codec =- let schema = Schema.Null- in- valueCodec schema Value.Null $ \value -> case value of- Value.Null null_ -> Just null_- _ -> Nothing--instance HasCodec Boolean.Boolean where- codec =- let schema = Schema.Boolean- in- valueCodec schema Value.Boolean $ \value -> case value of- Value.Boolean boolean -> Just boolean- _ -> Nothing--instance HasCodec Number.Number where- codec =- let schema = Schema.Number- in- valueCodec schema Value.Number $ \value -> case value of- Value.Number number -> Just number- _ -> Nothing--instance HasCodec String.String where- codec =- let schema = Schema.String Nothing Nothing- in- valueCodec schema Value.String $ \value -> case value of- Value.String string -> Just string- _ -> Nothing--instance HasCodec a => HasCodec (Array.Array a) where- codec = Codec.identified Codec.Codec- { Codec.decode = do- array <- castValue "Array" $ \value -> case value of- Value.Array array -> Just array- _ -> Nothing- either (Trans.lift . Trans.throwE) (pure . Array.fromList)- . traverse (Codec.decodeWith codec)- $ Array.toList array- , Codec.encode =- Codec.tap- $ Trans.lift- . Trans.put- . Value.Array- . Array.fromList- . fmap (Codec.encodeWith codec)- . Array.toList- , Codec.schema = do- ref <- Codec.getRef (codec :: Codec.Value a)- pure . Schema.unidentified $ Schema.Array- Nothing- Nothing- (Left ref)- Nothing- }--instance HasCodec a => HasCodec (Object.Object a) where- codec = Codec.identified Codec.Codec- { Codec.decode = do- object <- castValue "Object" $ \value -> case value of- Value.Object object -> Just object- _ -> Nothing- either (Trans.lift . Trans.throwE) (pure . Object.fromList)- . traverse- (\(Member.Member k v) ->- Member.Member k <$> Codec.decodeWith codec v- )- $ Object.toList object- , Codec.encode =- Codec.tap- $ Trans.lift- . Trans.put- . Value.Object- . Object.fromList- . fmap- (\(Member.Member k v) ->- Member.Member k $ Codec.encodeWith codec v- )- . Object.toList- , Codec.schema = do- ref <- Codec.getRef (codec :: Codec.Value a)- pure . Schema.unidentified . Schema.Object [] [] $ Just ref- }--instance HasCodec a => HasCodec (Nullable.Nullable a) where- codec = nullable codec--instance HasCodec a => HasCodec (Maybe a) where- codec =- Codec.identified $ Codec.map Nullable.toMaybe Nullable.fromMaybe codec--instance- ( HasCodec a- , HasCodec b- ) => HasCodec (Either a b) where- codec =- Codec.identified- $ Codec.mapMaybe- (Just . Left)- (either Just $ const Nothing)- (Codec.tagged "Left" codec)- <|> Codec.mapMaybe- (Just . Right)- (either (const Nothing) Just)- (Codec.tagged "Right" codec)--instance HasCodec () where- codec =- Codec.identified . Codec.fromArrayCodec Permission.Forbid $ pure ()--instance- ( HasCodec a- , HasCodec b- ) => HasCodec (a, b) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,)- <$> Codec.project fst (Codec.element codec)- <*> Codec.project snd (Codec.element codec)--instance- ( HasCodec a- , HasCodec b- , HasCodec c- ) => HasCodec (a, b, c) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,,)- <$> Codec.project (\(a, _, _) -> a) (Codec.element codec)- <*> Codec.project (\(_, b, _) -> b) (Codec.element codec)- <*> Codec.project (\(_, _, c) -> c) (Codec.element codec)--instance- ( HasCodec a- , HasCodec b- , HasCodec c- , HasCodec d- ) => HasCodec (a, b, c, d) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,,,)- <$> Codec.project (\(a, _, _, _) -> a) (Codec.element codec)- <*> Codec.project (\(_, b, _, _) -> b) (Codec.element codec)- <*> Codec.project (\(_, _, c, _) -> c) (Codec.element codec)- <*> Codec.project (\(_, _, _, d) -> d) (Codec.element codec)--instance- ( HasCodec a- , HasCodec b- , HasCodec c- , HasCodec d- , HasCodec e- ) => HasCodec (a, b, c, d, e) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,,,,)- <$> Codec.project (\(a, _, _, _, _) -> a) (Codec.element codec)- <*> Codec.project (\(_, b, _, _, _) -> b) (Codec.element codec)- <*> Codec.project (\(_, _, c, _, _) -> c) (Codec.element codec)- <*> Codec.project (\(_, _, _, d, _) -> d) (Codec.element codec)- <*> Codec.project (\(_, _, _, _, e) -> e) (Codec.element codec)--instance- ( HasCodec a- , HasCodec b- , HasCodec c- , HasCodec d- , HasCodec e- , HasCodec f- ) => HasCodec (a, b, c, d, e, f) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,,,,,)- <$> Codec.project (\(a, _, _, _, _, _) -> a) (Codec.element codec)- <*> Codec.project (\(_, b, _, _, _, _) -> b) (Codec.element codec)- <*> Codec.project (\(_, _, c, _, _, _) -> c) (Codec.element codec)- <*> Codec.project (\(_, _, _, d, _, _) -> d) (Codec.element codec)- <*> Codec.project (\(_, _, _, _, e, _) -> e) (Codec.element codec)- <*> Codec.project (\(_, _, _, _, _, f) -> f) (Codec.element codec)--instance- ( HasCodec a- , HasCodec b- , HasCodec c- , HasCodec d- , HasCodec e- , HasCodec f- , HasCodec g- ) => HasCodec (a, b, c, d, e, f, g) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,,,,,,)- <$> Codec.project- (\(a, _, _, _, _, _, _) -> a)- (Codec.element codec)- <*> Codec.project- (\(_, b, _, _, _, _, _) -> b)- (Codec.element codec)- <*> Codec.project- (\(_, _, c, _, _, _, _) -> c)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, d, _, _, _) -> d)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, e, _, _) -> e)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, _, f, _) -> f)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, _, _, g) -> g)- (Codec.element codec)--instance- ( HasCodec a- , HasCodec b- , HasCodec c- , HasCodec d- , HasCodec e- , HasCodec f- , HasCodec g- , HasCodec h- ) => HasCodec (a, b, c, d, e, f, g, h) where- codec =- Codec.identified- . Codec.fromArrayCodec Permission.Forbid- $ (,,,,,,,)- <$> Codec.project- (\(a, _, _, _, _, _, _, _) -> a)- (Codec.element codec)- <*> Codec.project- (\(_, b, _, _, _, _, _, _) -> b)- (Codec.element codec)- <*> Codec.project- (\(_, _, c, _, _, _, _, _) -> c)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, d, _, _, _, _) -> d)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, e, _, _, _) -> e)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, _, f, _, _) -> f)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, _, _, g, _) -> g)- (Codec.element codec)- <*> Codec.project- (\(_, _, _, _, _, _, _, h) -> h)- (Codec.element codec)--instance HasCodec Bool where- codec = Codec.identified $ Codec.map Boolean.toBool Boolean.fromBool codec--instance HasCodec Decimal.Decimal where- codec =- Codec.identified $ Codec.map Number.toDecimal Number.fromDecimal codec--instance HasCodec Text.Text where- codec = Codec.identified $ Codec.map String.toText String.fromText codec--instance {-# OVERLAPPABLE #-} HasCodec a => HasCodec [a] where- codec = Codec.identified $ Codec.map Array.toList Array.fromList codec--instance HasCodec a => HasCodec (Map.Map Name.Name a) where- codec = Codec.identified $ Codec.map- (Map.fromList . fmap Member.toTuple . Object.toList)- (Object.fromList . fmap Member.fromTuple . Map.toList)- codec--instance HasCodec a => HasCodec (Map.Map String.String a) where- codec = Codec.identified $ Codec.map- (Map.mapKeys Name.toString)- (Map.mapKeys Name.fromString)- codec--instance HasCodec a => HasCodec (Map.Map Text.Text a) where- codec = Codec.identified $ Codec.map- (Map.mapKeys String.toText)- (Map.mapKeys String.fromText)- codec--instance HasCodec a => HasCodec (Map.Map Text.LazyText a) where- codec = Codec.identified $ Codec.map- (Map.mapKeys Text.fromStrict)- (Map.mapKeys Text.toStrict)- codec--instance HasCodec a => HasCodec (Map.Map String a) where- codec = Codec.identified- $ Codec.map (Map.mapKeys Text.unpack) (Map.mapKeys Text.pack) codec--instance HasCodec String where- codec = Codec.identified $ Codec.map Text.unpack Text.pack codec--instance HasCodec Char where- codec =- let schema = Schema.unidentified $ Schema.String (Just 1) (Just 1)- in- Codec.identified $ Codec.mapMaybe- (\x -> case Text.uncons x of- Just (y, z) | Text.null z -> Just y- _ -> Nothing- )- (Just . Text.singleton)- codec { Codec.schema = pure schema }--instance HasCodec Text.LazyText where- codec = Codec.identified $ Codec.map Text.fromStrict Text.toStrict codec--instance HasCodec a => HasCodec (NonEmpty.NonEmpty a) where- codec =- let- schema = do- itemSchema <- Codec.schema (codec :: Codec.Value a)- pure . Schema.unidentified $ Schema.Array- (Just 1)- Nothing- (Left $ Schema.maybeRef itemSchema)- Nothing- in- Codec.identified $ Codec.mapMaybe- NonEmpty.nonEmpty- (Just . NonEmpty.toList)- codec { Codec.schema = schema }--instance HasCodec Integer where- codec =- let schema = Schema.unidentified $ Schema.Integer Nothing Nothing- in- Codec.identified $ Codec.mapMaybe- Decimal.toInteger- (Just . Decimal.fromInteger)- codec { Codec.schema = pure schema }--instance HasCodec Int where- codec = integralCodec--instance HasCodec Int.Int8 where- codec = integralCodec--instance HasCodec Int.Int16 where- codec = integralCodec--instance HasCodec Int.Int32 where- codec = integralCodec--instance HasCodec Int.Int64 where- codec = integralCodec--instance HasCodec Natural.Natural where- codec =- let- from = Bits.toIntegralSized :: Integer -> Maybe Natural.Natural- into = fromIntegral :: Natural.Natural -> Integer- schema = Schema.unidentified $ Schema.Integer (Just 0) Nothing- in Codec.identified $ Codec.mapMaybe- from- (Just . into)- codec { Codec.schema = pure schema }--instance HasCodec Word where- codec = integralCodec--instance HasCodec Word.Word8 where- codec = integralCodec--instance HasCodec Word.Word16 where- codec = integralCodec--instance HasCodec Word.Word32 where- codec = integralCodec--instance HasCodec Word.Word64 where- codec = integralCodec--instance HasCodec Float where- codec = Codec.identified $ Codec.mapMaybe- (Just . Decimal.toRealFloat)- Decimal.fromRealFloat- codec--instance HasCodec Double where- codec = Codec.identified $ Codec.mapMaybe- (Just . Decimal.toRealFloat)- Decimal.fromRealFloat- codec--instance HasCodec Pointer.Pointer where- codec = Codec.identified $ Codec.mapMaybe- (either (const Nothing) Just- . Decoder.run Pointer.decode- . Text.encodeUtf8- )- (either (const Nothing) Just- . Text.decodeUtf8'- . ByteString.toStrict- . Builder.toLazyByteString- . Encoder.run Config.initial- . Pointer.encode- )- codec--instance HasCodec Identifier.Identifier where- codec =- let prefix = Text.pack "#/definitions/"- in- Codec.identified $ Codec.mapMaybe- (fmap Identifier.fromText . Text.stripPrefix prefix)- (Just . mappend prefix . Identifier.toText)- codec--instance HasCodec Name.Name where- codec = Codec.identified $ Codec.map Name.fromString Name.toString codec--instance HasCodec Schema.Schema where- codec =- let- trueCodec =- Codec.mapMaybe- (const $ Just Schema.True)- (\x -> case x of- Schema.True -> Just ()- _ -> Nothing- )- . Codec.literalCodec- . Value.Boolean- $ Boolean.fromBool True- falseCodec =- Codec.mapMaybe- (const $ Just Schema.False)- (\x -> case x of- Schema.False -> Just ()- _ -> Nothing- )- . Codec.literalCodec- . Value.Boolean- $ Boolean.fromBool False- constCodec =- Codec.mapMaybe- (Just . Schema.Const)- (\x -> case x of- Schema.Const y -> Just y- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ Codec.required (name "const") codec- nullCodec =- Codec.mapMaybe- (const $ Just Schema.Null)- (\x -> case x of- Schema.Null -> Just ()- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- . Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "null"- booleanCodec =- Codec.mapMaybe- (const $ Just Schema.Boolean)- (\x -> case x of- Schema.Boolean -> Just ()- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- . Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "boolean"- numberCodec =- Codec.mapMaybe- (const $ Just Schema.Number)- (\x -> case x of- Schema.Number -> Just ()- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- . Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "number"- integerCodec =- Codec.mapMaybe- (\(_, y, z) -> Just $ Schema.Integer- (Optional.toMaybe y)- (Optional.toMaybe z)- )- (\x -> case x of- Schema.Integer y z ->- Just- ( ()- , Optional.fromMaybe y- , Optional.fromMaybe z- )- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ (,,)- <$> Codec.project- (\(a, _, _) -> a)- (Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "integer"- )- <*> Codec.project- (\(_, b, _) -> b)- (Codec.optional (name "minimum") codec)- <*> Codec.project- (\(_, _, c) -> c)- (Codec.optional (name "maximum") codec)- stringCodec =- Codec.mapMaybe- (\(_, y, z) -> Just $ Schema.String- (Optional.toMaybe y)- (Optional.toMaybe z)- )- (\x -> case x of- Schema.String y z ->- Just- ( ()- , Optional.fromMaybe y- , Optional.fromMaybe z- )- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ (,,)- <$> Codec.project- (\(a, _, _) -> a)- (Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "string"- )- <*> Codec.project- (\(_, b, _) -> b)- (Codec.optional (name "minLength") codec)- <*> Codec.project- (\(_, _, c) -> c)- (Codec.optional (name "maxLength") codec)- arrayCodec =- Codec.mapMaybe- (\(_, lo, hi, e, m) -> Just $ Schema.Array- (Optional.toMaybe lo)- (Optional.toMaybe hi)- e- (Optional.toMaybe m)- )- (\x -> case x of- Schema.Array lo hi e m -> Just- ( ()- , Optional.fromMaybe lo- , Optional.fromMaybe hi- , e- , Optional.fromMaybe m- )- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ (,,,,)- <$> Codec.project- (\(a, _, _, _, _) -> a)- (Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "array"- )- <*> Codec.project- (\(_, b, _, _, _) -> b)- (Codec.optional (name "minItems") codec)- <*> Codec.project- (\(_, _, c, _, _) -> c)- (Codec.optional (name "maxItems") codec)- <*> Codec.project- (\(_, _, _, d, _) -> d)- (Codec.required (name "items")- . Codec.withIdentifier- (Identifier.fromText- $ Text.pack "OneOf Schema [Schema]"- )- $ Codec.mapMaybe- (Just . Left)- (either Just $ const Nothing)- codec- <|> Codec.mapMaybe- (Just . Right)- (either (const Nothing) Just)- codec- )- <*> Codec.project- (\(_, _, _, _, e) -> e)- (Codec.optional (name "additionalItems") codec)- objectCodec =- Codec.mapMaybe- (\(_, ps, rs, m) -> Just $ Schema.Object- (fmap Member.toTuple- . foldMap Object.toList- $ Optional.toMaybe ps- )- (Maybe.fromMaybe [] $ Optional.toMaybe rs)- (Optional.toMaybe m)- )- (\x -> case x of- Schema.Object ps rs m -> Just- ( ()- , if null ps- then Optional.nothing- else Optional.just . Object.fromList $ fmap- Member.fromTuple- ps- , if null rs- then Optional.nothing- else Optional.just rs- , Optional.fromMaybe m- )- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ (,,,)- <$> Codec.project- (\(a, _, _, _) -> a)- (Codec.required (name "type")- . Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack "object"- )- <*> Codec.project- (\(_, b, _, _) -> b)- (Codec.optional (name "properties") codec)- <*> Codec.project- (\(_, _, c, _) -> c)- (Codec.optional (name "required") codec)- <*> Codec.project- (\(_, _, _, d) -> d)- (Codec.optional (name "additionalProperties") codec- )- refCodec =- Codec.mapMaybe- (Just . Schema.Ref)- (\x -> case x of- Schema.Ref y -> Just y- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ Codec.required (name "$ref") codec- oneOfCodec =- Codec.mapMaybe- (Just . Schema.OneOf)- (\x -> case x of- Schema.OneOf y -> Just y- _ -> Nothing- )- . Codec.fromObjectCodec Permission.Forbid- $ Codec.required (name "oneOf") codec- in- Codec.identified- $ trueCodec- <|> falseCodec- <|> constCodec- <|> nullCodec- <|> booleanCodec- <|> numberCodec- <|> integerCodec- <|> stringCodec- <|> arrayCodec- <|> objectCodec- <|> refCodec- <|> oneOfCodec--name :: String -> Name.Name-name = Name.fromString . String.fromText . Text.pack--valueCodec- :: forall a- . Typeable.Typeable a- => Schema.Schema- -> (a -> Value.Value)- -> (Value.Value -> Maybe a)- -> Codec.Value a-valueCodec schema toValue fromValue = Codec.identified Codec.Codec- { Codec.decode = castValue- (Codec.typeName (Typeable.Proxy :: Typeable.Proxy a))- fromValue- , Codec.encode = Codec.tap $ Trans.lift . Trans.put . toValue- , Codec.schema = pure $ Schema.unidentified schema- }--castValue- :: String- -> (Value.Value -> Maybe a)- -> Trans.ReaderT- Value.Value- (Trans.ExceptT String Identity.Identity)- a-castValue expected fromValue = do- value <- Trans.ask- case fromValue value of- Nothing -> Trans.lift . Trans.throwE $ typeMismatch expected value- Just x -> pure x--typeMismatch :: String -> Value.Value -> String-typeMismatch expected value =- let- actual = case value of- Value.Null _ -> "Null"- Value.Boolean _ -> "Boolean"- Value.Number _ -> "Number"- Value.String _ -> "String"- Value.Array _ -> "Array"- Value.Object _ -> "Object"- in "expected " <> expected <> " but got " <> actual--integralCodec- :: forall a- . (Bits.Bits a, Bounded a, Integral a, Typeable.Typeable a)- => Codec.Value a-integralCodec =- let- from = Bits.toIntegralSized :: Integer -> Maybe a- into = fromIntegral :: a -> Integer- schema = Schema.unidentified $ Schema.Integer- (Just $ toInteger (minBound :: a))- (Just $ toInteger (maxBound :: a))- in Codec.identified $ Codec.mapMaybe- from- (Just . into)- codec { Codec.schema = pure schema }--optionalNullable- :: Typeable.Typeable a- => Name.Name- -> Codec.Value a- -> Codec.Object (Maybe a)-optionalNullable k =- Codec.map- (maybe Nothing Nullable.toMaybe . Optional.toMaybe)- (Optional.fromMaybe . fmap Nullable.just)- . Codec.optional k- . nullable--nullable- :: Typeable.Typeable a- => Codec.Value a- -> Codec.Value (Nullable.Nullable a)-nullable c =- Codec.identified- $ Codec.mapMaybe (Just . Nullable.just) Nullable.toMaybe c- <|> Codec.map (const Nullable.nothing) (const $ Null.fromUnit ()) codec
− source/library/Argo/Codec/Array.hs
@@ -1,61 +0,0 @@-module Argo.Codec.Array where--import qualified Argo.Codec.Codec as Codec-import qualified Argo.Codec.List as Codec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Json.Array as Array-import qualified Argo.Json.Value as Value-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Type.Permission as Permission-import qualified Argo.Vendor.Map as Map-import qualified Argo.Vendor.Transformers as Trans-import qualified Data.Functor.Identity as Identity-import qualified Data.List.NonEmpty as NonEmpty--type Array a- = Codec.List- ( Trans.AccumT- (Map.Map Identifier.Identifier Schema.Schema)- Identity.Identity- [(Maybe Identifier.Identifier, Schema.Schema)]- )- Value.Value- a--fromArrayCodec :: Permission.Permission -> Array a -> Codec.Value a-fromArrayCodec =- Codec.fromListCodec- (\permission schemasM -> do- schemas <- schemasM- pure . Schema.unidentified $ Schema.Array- (Just . fromIntegral $ length schemas)- (case permission of- Permission.Allow -> Nothing- Permission.Forbid ->- Just . fromIntegral $ length schemas- )- (case NonEmpty.nonEmpty $ fmap Schema.maybeRef schemas of- Nothing -> Left Schema.False- Just xs -> Right xs- )- Nothing- )- $ Codec.map Array.toList Array.fromList Codec.arrayCodec--element :: Codec.Value a -> Array a-element c = Codec.Codec- { Codec.decode = do- l <- Trans.get- case l of- [] -> Trans.lift $ Trans.throwE "unexpected empty list"- h : t -> case Codec.decodeWith c h of- Left y -> Trans.lift $ Trans.throwE y- Right y -> do- Trans.put t- pure y- , Codec.encode = \x -> do- Trans.tell [Codec.encodeWith c x]- pure x- , Codec.schema = pure . Schema.unidentified <$> Codec.getRef c- }
− source/library/Argo/Codec/Codec.hs
@@ -1,92 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}--module Argo.Codec.Codec where--import Control.Applicative ((<|>))--import qualified Control.Applicative as Applicative--data Codec r w s i o = Codec- { decode :: r o- , encode :: i -> w o- , schema :: s- }--instance (Functor r, Functor w) => Functor (Codec r w s i) where- fmap f c = Codec- { decode = f <$> decode c- , encode = fmap f . encode c- , schema = schema c- }--instance- ( Applicative r- , Applicative w- , Applicative s- , Monoid a- ) => Applicative (Codec r w (s a) i) where- pure x = Codec- { decode = pure x- , encode = const $ pure x- , schema = pure mempty- }- cf <*> cx = Codec- { decode = decode cf <*> decode cx- , encode = \i -> encode cf i <*> encode cx i- , schema = (<>) <$> schema cf <*> schema cx- }--instance- ( Applicative.Alternative r- , Applicative.Alternative w- , Applicative s- , Monoid a- ) => Applicative.Alternative (Codec r w (s a) i) where- empty = Codec- { decode = Applicative.empty- , encode = const Applicative.empty- , schema = pure mempty- }- cx <|> cy = Codec- { decode = decode cx <|> decode cy- , encode = \i -> encode cx i <|> encode cy i- , schema = (<>) <$> schema cx <*> schema cy- }--map- :: (Functor r, Functor w)- => (a -> b)- -> (b -> a)- -> Codec r w s a a- -> Codec r w s b b-map f g c = Codec- { decode = f <$> decode c- , encode = fmap f . encode c . g- , schema = schema c- }--mapMaybe- :: (Applicative.Alternative r, Applicative.Alternative w, Monad r, Monad w)- => (o2 -> Maybe o1)- -> (i1 -> Maybe i2)- -> Codec r w s i2 o2- -> Codec r w s i1 o1-mapMaybe f g c = Codec- { decode = do- o2 <- decode c- toAlternative $ f o2- , encode = \i1 -> do- i2 <- toAlternative $ g i1- o2 <- encode c i2- toAlternative $ f o2- , schema = schema c- }--project :: (i -> f) -> Codec r w s f o -> Codec r w s i o-project f c = c { encode = encode c . f }--tap :: Functor f => (a -> f b) -> a -> f a-tap f x = x <$ f x--toAlternative :: Applicative.Alternative m => Maybe a -> m a-toAlternative = maybe Applicative.empty pure
− source/library/Argo/Codec/List.hs
@@ -1,57 +0,0 @@-module Argo.Codec.List where--import qualified Argo.Codec.Codec as Codec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Type.Permission as Permission-import qualified Argo.Vendor.Map as Map-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified Data.Functor.Identity as Identity--type List s e a- = Codec.Codec- (Trans.StateT [e] (Trans.ExceptT String Identity.Identity))- (Trans.WriterT [e] Identity.Identity)- s- a- a--fromListCodec- :: ( Permission.Permission- -> s- -> Trans.AccumT- (Map.Map Identifier.Identifier Schema.Schema)- Identity.Identity- (Maybe Identifier.Identifier, Schema.Schema)- )- -> Codec.Value [e]- -> Permission.Permission- -> List s e a- -> Codec.Value a-fromListCodec f ce p ca = Codec.Codec- { Codec.decode = do- xs <- Codec.decode ce- case- Identity.runIdentity . Trans.runExceptT $ Trans.runStateT- (Codec.decode ca)- xs- of- Left x -> Trans.lift $ Trans.throwE x- Right (x, ys) -> do- case (p, ys) of- (Permission.Forbid, _ : _) ->- Trans.lift $ Trans.throwE "leftover elements"- _ -> pure ()- pure x- , Codec.encode = \x -> do- Monad.void- . Codec.encode ce- . snd- . Identity.runIdentity- . Trans.runWriterT- $ Codec.encode ca x- pure x- , Codec.schema = f p $ Codec.schema ca- }
− source/library/Argo/Codec/Object.hs
@@ -1,116 +0,0 @@-module Argo.Codec.Object where--import qualified Argo.Codec.Codec as Codec-import qualified Argo.Codec.List as Codec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Json.Member as Member-import qualified Argo.Json.Name as Name-import qualified Argo.Json.Object as Object-import qualified Argo.Json.String as String-import qualified Argo.Json.Value as Value-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Type.Optional as Optional-import qualified Argo.Type.Permission as Permission-import qualified Argo.Vendor.Map as Map-import qualified Argo.Vendor.Text as Text-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified Data.Functor.Identity as Identity-import qualified Data.List as List-import qualified Data.Maybe as Maybe--type Object a- = Codec.List- ( Trans.AccumT- (Map.Map Identifier.Identifier Schema.Schema)- Identity.Identity- [ ( (Name.Name, Bool)- , (Maybe Identifier.Identifier, Schema.Schema)- )- ]- )- (Member.Member Value.Value)- a--fromObjectCodec :: Permission.Permission -> Object a -> Codec.Value a-fromObjectCodec =- Codec.fromListCodec- (\permission schemasM -> do- schemas <- schemasM- pure- . Schema.unidentified- . Schema.Object- (fmap- (\((k, _), s) -> (k, Schema.maybeRef s))- schemas- )- (Maybe.mapMaybe- (\((k, r), _) -> if r then Just k else Nothing)- schemas- )- $ case permission of- Permission.Allow -> Nothing- Permission.Forbid -> Just Schema.False- )- $ Codec.map Object.toList Object.fromList Codec.objectCodec--required :: Name.Name -> Codec.Value a -> Object a-required k c = Codec.Codec- { Codec.decode = do- m <- Codec.decode (optional k c)- case Optional.toMaybe m of- Nothing ->- Trans.lift- . Trans.throwE- $ "missing required member: "- <> show k- Just x -> pure x- , Codec.encode = \x -> do- Monad.void . Codec.encode (optional k c) $ Optional.just x- pure x- , Codec.schema =- pure . (,) (k, True) . Schema.unidentified <$> Codec.getRef c- }--optional :: Name.Name -> Codec.Value a -> Object (Optional.Optional a)-optional k c = Codec.Codec- { Codec.decode = do- xs <- Trans.get- case List.partition (\(Member.Member j _) -> j == k) xs of- (Member.Member _ x : _, ys) -> case Codec.decodeWith c x of- Left y -> Trans.lift $ Trans.throwE y- Right y -> do- Trans.put ys- pure $ Optional.just y- _ -> pure Optional.nothing- , Codec.encode = \x -> do- case Optional.toMaybe x of- Nothing -> pure ()- Just y -> Trans.tell [Member.Member k $ Codec.encodeWith c y]- pure x- , Codec.schema =- pure . (,) (k, False) . Schema.unidentified <$> Codec.getRef c- }--tagged :: String -> Codec.Value a -> Codec.Value a-tagged t c =- Codec.map snd ((,) ())- . fromObjectCodec Permission.Forbid- $ (,)- <$> Codec.project- fst- (required- (Name.fromString . String.fromText $ Text.pack "type")- (Codec.literalCodec- . Value.String- . String.fromText- $ Text.pack t- )- )- <*> Codec.project- snd- (required- (Name.fromString . String.fromText $ Text.pack "value")- c- )
− source/library/Argo/Codec/Value.hs
@@ -1,124 +0,0 @@-{-# LANGUAGE ScopedTypeVariables #-}--module Argo.Codec.Value where--import qualified Argo.Codec.Codec as Codec-import qualified Argo.Json.Array as Array-import qualified Argo.Json.Null as Null-import qualified Argo.Json.Object as Object-import qualified Argo.Json.Value as Value-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Vendor.Map as Map-import qualified Argo.Vendor.Text as Text-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified Data.Functor.Identity as Identity-import qualified Data.Typeable as Typeable--decodeWith :: Value a -> Value.Value -> Either String a-decodeWith c =- Identity.runIdentity . Trans.runExceptT . Trans.runReaderT (Codec.decode c)--encodeWith :: Value a -> a -> Value.Value-encodeWith c x =- snd- . Identity.runIdentity- . Trans.runStateT (Trans.runMaybeT $ Codec.encode c x)- . Value.Null- $ Null.fromUnit ()--type Value a- = Codec.Codec- (Trans.ReaderT Value.Value (Trans.ExceptT String Identity.Identity))- (Trans.MaybeT (Trans.StateT Value.Value Identity.Identity))- ( Trans.AccumT- (Map.Map Identifier.Identifier Schema.Schema)- Identity.Identity- (Maybe Identifier.Identifier, Schema.Schema)- )- a- a--arrayCodec :: Value (Array.Array Value.Value)-arrayCodec = Codec.Codec- { Codec.decode = do- x <- Trans.ask- case x of- Value.Array y -> pure y- _ ->- Trans.lift . Trans.throwE $ "expected Array but got " <> show x- , Codec.encode = \x -> do- Trans.lift . Trans.put $ Value.Array x- pure x- , Codec.schema = pure $ Schema.unidentified Schema.false- }--objectCodec :: Value (Object.Object Value.Value)-objectCodec = Codec.Codec- { Codec.decode = do- x <- Trans.ask- case x of- Value.Object y -> pure y- _ ->- Trans.lift- . Trans.throwE- $ "expected Object but got "- <> show x- , Codec.encode = \x -> do- Trans.lift . Trans.put $ Value.Object x- pure x- , Codec.schema = pure $ Schema.unidentified Schema.false- }--literalCodec :: Value.Value -> Value ()-literalCodec expected = Codec.Codec- { Codec.decode = do- actual <- Trans.ask- Monad.when (actual /= expected)- . Trans.lift- . Trans.throwE- $ "expected "- <> show expected- <> " but got "- <> show actual- , Codec.encode = const . Trans.lift $ Trans.put expected- , Codec.schema = pure . Schema.unidentified $ Schema.Const expected- }--identified :: forall a . Typeable.Typeable a => Value a -> Value a-identified = withIdentifier . Identifier.fromText . Text.pack $ typeName- (Typeable.Proxy :: Typeable.Proxy a)--withIdentifier :: Identifier.Identifier -> Value a -> Value a-withIdentifier identifier codec =- let- newSchema = do- (_, schema) <- Codec.schema codec- Trans.add $ Map.singleton identifier schema- pure $ Schema.withIdentifier identifier schema- in codec { Codec.schema = newSchema }--typeName :: Typeable.Typeable a => Typeable.Proxy a -> String-typeName = show . Typeable.typeRep--getRef- :: Value a- -> Trans.AccumT- (Map.Map Identifier.Identifier Schema.Schema)- Identity.Identity- Schema.Schema-getRef codec = do- let- (maybeIdentifier, schema) =- fst . Identity.runIdentity $ Trans.runAccumT- (Codec.schema codec)- Map.empty- case maybeIdentifier of- Nothing -> pure schema- Just identifier -> do- schemas <- Trans.look- Monad.unless (Map.member identifier schemas) $ do- Trans.add $ Map.singleton identifier schema- Monad.void $ Codec.schema codec- pure $ Schema.Ref identifier
− source/library/Argo/Decode.hs
@@ -1,16 +0,0 @@-module Argo.Decode where--import qualified Argo.Class.HasCodec as HasCodec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Json.Value as Value-import qualified Argo.Pointer.Pointer as Pointer-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Vendor.ByteString as ByteString--decode :: HasCodec.HasCodec a => ByteString.ByteString -> Either String a-decode x = do- y <- Decoder.run (Decoder.spaces *> Value.decode) x- Codec.decodeWith HasCodec.codec y--decodePointer :: ByteString.ByteString -> Either String Pointer.Pointer-decodePointer = Decoder.run Pointer.decode
− source/library/Argo/Encode.hs
@@ -1,30 +0,0 @@-module Argo.Encode where--import qualified Argo.Class.HasCodec as HasCodec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Json.Value as Value-import qualified Argo.Literal as Literal-import qualified Argo.Pointer.Pointer as Pointer-import qualified Argo.Type.Config as Config-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Type.Indent as Indent-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad--encode :: HasCodec.HasCodec a => a -> Builder.Builder-encode = encodeWith $ Indent.Spaces 0--encodeWith :: HasCodec.HasCodec a => Indent.Indent -> a -> Builder.Builder-encodeWith i x =- let c = Config.initial { Config.indent = i }- in- Encoder.run c $ do- Value.encode $ Codec.encodeWith HasCodec.codec x- Monad.when (Config.hasIndent c)- . Trans.lift- . Trans.tell- $ Builder.word8 Literal.newLine--encodePointer :: Pointer.Pointer -> Builder.Builder-encodePointer = Encoder.run Config.initial . Pointer.encode
+ source/library/Argo/Internal/Class/HasCodec.hs view
@@ -0,0 +1,818 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Argo.Internal.Class.HasCodec where++import Control.Applicative ((<|>))++import qualified Argo.Internal.Codec.Array as Codec+import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Codec.Object as Codec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Boolean as Boolean+import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.Null as Null+import qualified Argo.Internal.Json.Number as Number+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Pointer.Pointer as Pointer+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Internal.Type.Config as Config+import qualified Argo.Internal.Type.Decimal as Decimal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Internal.Type.Nullable as Nullable+import qualified Argo.Internal.Type.Optional as Optional+import qualified Argo.Internal.Type.Permission as Permission+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.ByteString as ByteString+import qualified Argo.Vendor.Map as Map+import qualified Argo.Vendor.Text as Text+import qualified Argo.Vendor.Transformers as Trans+import qualified Data.Bits as Bits+import qualified Data.Functor.Identity as Identity+import qualified Data.Int as Int+import qualified Data.List.NonEmpty as NonEmpty+import qualified Data.Maybe as Maybe+import qualified Data.Typeable as Typeable+import qualified Data.Word as Word+import qualified Numeric.Natural as Natural++class Typeable.Typeable a => HasCodec a where+ codec :: Codec.Value a++instance HasCodec Value.Value where+ codec = valueCodec Schema.true id Just++instance HasCodec Null.Null where+ codec =+ let schema = Schema.Null+ in+ valueCodec schema Value.Null $ \value -> case value of+ Value.Null null_ -> Just null_+ _ -> Nothing++instance HasCodec Boolean.Boolean where+ codec =+ let schema = Schema.Boolean+ in+ valueCodec schema Value.Boolean $ \value -> case value of+ Value.Boolean boolean -> Just boolean+ _ -> Nothing++instance HasCodec Number.Number where+ codec =+ let schema = Schema.Number+ in+ valueCodec schema Value.Number $ \value -> case value of+ Value.Number number -> Just number+ _ -> Nothing++instance HasCodec String.String where+ codec =+ let schema = Schema.String Nothing Nothing+ in+ valueCodec schema Value.String $ \value -> case value of+ Value.String string -> Just string+ _ -> Nothing++instance HasCodec a => HasCodec (Array.Array a) where+ codec = Codec.identified Codec.Codec+ { Codec.decode = do+ array <- castValue "Array" $ \value -> case value of+ Value.Array array -> Just array+ _ -> Nothing+ either (Trans.lift . Trans.throwE) (pure . Array.fromList)+ . traverse (Codec.decodeWith codec)+ $ Array.toList array+ , Codec.encode =+ Codec.tap+ $ Trans.lift+ . Trans.put+ . Value.Array+ . Array.fromList+ . fmap (Codec.encodeWith codec)+ . Array.toList+ , Codec.schema = do+ ref <- Codec.getRef (codec :: Codec.Value a)+ pure . Schema.unidentified $ Schema.Array+ Nothing+ Nothing+ (Left ref)+ Nothing+ }++instance HasCodec a => HasCodec (Object.Object a) where+ codec = Codec.identified Codec.Codec+ { Codec.decode = do+ object <- castValue "Object" $ \value -> case value of+ Value.Object object -> Just object+ _ -> Nothing+ either (Trans.lift . Trans.throwE) (pure . Object.fromList)+ . traverse+ (\(Member.Member k v) ->+ Member.Member k <$> Codec.decodeWith codec v+ )+ $ Object.toList object+ , Codec.encode =+ Codec.tap+ $ Trans.lift+ . Trans.put+ . Value.Object+ . Object.fromList+ . fmap+ (\(Member.Member k v) ->+ Member.Member k $ Codec.encodeWith codec v+ )+ . Object.toList+ , Codec.schema = do+ ref <- Codec.getRef (codec :: Codec.Value a)+ pure . Schema.unidentified . Schema.Object [] [] $ Just ref+ }++instance HasCodec a => HasCodec (Nullable.Nullable a) where+ codec = nullable codec++instance HasCodec a => HasCodec (Maybe a) where+ codec =+ Codec.identified $ Codec.map Nullable.toMaybe Nullable.fromMaybe codec++instance+ ( HasCodec a+ , HasCodec b+ ) => HasCodec (Either a b) where+ codec =+ Codec.identified+ $ Codec.mapMaybe+ (Just . Left)+ (either Just $ const Nothing)+ (Codec.tagged "Left" codec)+ <|> Codec.mapMaybe+ (Just . Right)+ (either (const Nothing) Just)+ (Codec.tagged "Right" codec)++instance HasCodec () where+ codec =+ Codec.identified . Codec.fromArrayCodec Permission.Forbid $ pure ()++instance+ ( HasCodec a+ , HasCodec b+ ) => HasCodec (a, b) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,)+ <$> Codec.project fst (Codec.element codec)+ <*> Codec.project snd (Codec.element codec)++instance+ ( HasCodec a+ , HasCodec b+ , HasCodec c+ ) => HasCodec (a, b, c) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,,)+ <$> Codec.project (\(a, _, _) -> a) (Codec.element codec)+ <*> Codec.project (\(_, b, _) -> b) (Codec.element codec)+ <*> Codec.project (\(_, _, c) -> c) (Codec.element codec)++instance+ ( HasCodec a+ , HasCodec b+ , HasCodec c+ , HasCodec d+ ) => HasCodec (a, b, c, d) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,,,)+ <$> Codec.project (\(a, _, _, _) -> a) (Codec.element codec)+ <*> Codec.project (\(_, b, _, _) -> b) (Codec.element codec)+ <*> Codec.project (\(_, _, c, _) -> c) (Codec.element codec)+ <*> Codec.project (\(_, _, _, d) -> d) (Codec.element codec)++instance+ ( HasCodec a+ , HasCodec b+ , HasCodec c+ , HasCodec d+ , HasCodec e+ ) => HasCodec (a, b, c, d, e) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,,,,)+ <$> Codec.project (\(a, _, _, _, _) -> a) (Codec.element codec)+ <*> Codec.project (\(_, b, _, _, _) -> b) (Codec.element codec)+ <*> Codec.project (\(_, _, c, _, _) -> c) (Codec.element codec)+ <*> Codec.project (\(_, _, _, d, _) -> d) (Codec.element codec)+ <*> Codec.project (\(_, _, _, _, e) -> e) (Codec.element codec)++instance+ ( HasCodec a+ , HasCodec b+ , HasCodec c+ , HasCodec d+ , HasCodec e+ , HasCodec f+ ) => HasCodec (a, b, c, d, e, f) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,,,,,)+ <$> Codec.project (\(a, _, _, _, _, _) -> a) (Codec.element codec)+ <*> Codec.project (\(_, b, _, _, _, _) -> b) (Codec.element codec)+ <*> Codec.project (\(_, _, c, _, _, _) -> c) (Codec.element codec)+ <*> Codec.project (\(_, _, _, d, _, _) -> d) (Codec.element codec)+ <*> Codec.project (\(_, _, _, _, e, _) -> e) (Codec.element codec)+ <*> Codec.project (\(_, _, _, _, _, f) -> f) (Codec.element codec)++instance+ ( HasCodec a+ , HasCodec b+ , HasCodec c+ , HasCodec d+ , HasCodec e+ , HasCodec f+ , HasCodec g+ ) => HasCodec (a, b, c, d, e, f, g) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,,,,,,)+ <$> Codec.project+ (\(a, _, _, _, _, _, _) -> a)+ (Codec.element codec)+ <*> Codec.project+ (\(_, b, _, _, _, _, _) -> b)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, c, _, _, _, _) -> c)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, d, _, _, _) -> d)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, e, _, _) -> e)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, _, f, _) -> f)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, _, _, g) -> g)+ (Codec.element codec)++instance+ ( HasCodec a+ , HasCodec b+ , HasCodec c+ , HasCodec d+ , HasCodec e+ , HasCodec f+ , HasCodec g+ , HasCodec h+ ) => HasCodec (a, b, c, d, e, f, g, h) where+ codec =+ Codec.identified+ . Codec.fromArrayCodec Permission.Forbid+ $ (,,,,,,,)+ <$> Codec.project+ (\(a, _, _, _, _, _, _, _) -> a)+ (Codec.element codec)+ <*> Codec.project+ (\(_, b, _, _, _, _, _, _) -> b)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, c, _, _, _, _, _) -> c)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, d, _, _, _, _) -> d)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, e, _, _, _) -> e)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, _, f, _, _) -> f)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, _, _, g, _) -> g)+ (Codec.element codec)+ <*> Codec.project+ (\(_, _, _, _, _, _, _, h) -> h)+ (Codec.element codec)++instance HasCodec Bool where+ codec = Codec.identified $ Codec.map Boolean.toBool Boolean.fromBool codec++instance HasCodec Decimal.Decimal where+ codec =+ Codec.identified $ Codec.map Number.toDecimal Number.fromDecimal codec++instance HasCodec Text.Text where+ codec = Codec.identified $ Codec.map String.toText String.fromText codec++instance {-# OVERLAPPABLE #-} HasCodec a => HasCodec [a] where+ codec = Codec.identified $ Codec.map Array.toList Array.fromList codec++instance HasCodec a => HasCodec (Map.Map Name.Name a) where+ codec = Codec.identified $ Codec.map+ (Map.fromList . fmap Member.toTuple . Object.toList)+ (Object.fromList . fmap Member.fromTuple . Map.toList)+ codec++instance HasCodec a => HasCodec (Map.Map String.String a) where+ codec = Codec.identified $ Codec.map+ (Map.mapKeys Name.toString)+ (Map.mapKeys Name.fromString)+ codec++instance HasCodec a => HasCodec (Map.Map Text.Text a) where+ codec = Codec.identified $ Codec.map+ (Map.mapKeys String.toText)+ (Map.mapKeys String.fromText)+ codec++instance HasCodec a => HasCodec (Map.Map Text.LazyText a) where+ codec = Codec.identified $ Codec.map+ (Map.mapKeys Text.fromStrict)+ (Map.mapKeys Text.toStrict)+ codec++instance HasCodec a => HasCodec (Map.Map String a) where+ codec = Codec.identified+ $ Codec.map (Map.mapKeys Text.unpack) (Map.mapKeys Text.pack) codec++instance HasCodec String where+ codec = Codec.identified $ Codec.map Text.unpack Text.pack codec++instance HasCodec Char where+ codec =+ let schema = Schema.unidentified $ Schema.String (Just 1) (Just 1)+ in+ Codec.identified $ Codec.mapMaybe+ (\x -> case Text.uncons x of+ Just (y, z) | Text.null z -> Just y+ _ -> Nothing+ )+ (Just . Text.singleton)+ codec { Codec.schema = pure schema }++instance HasCodec Text.LazyText where+ codec = Codec.identified $ Codec.map Text.fromStrict Text.toStrict codec++instance HasCodec a => HasCodec (NonEmpty.NonEmpty a) where+ codec =+ let+ schema = do+ itemSchema <- Codec.schema (codec :: Codec.Value a)+ pure . Schema.unidentified $ Schema.Array+ (Just 1)+ Nothing+ (Left $ Schema.maybeRef itemSchema)+ Nothing+ in+ Codec.identified $ Codec.mapMaybe+ NonEmpty.nonEmpty+ (Just . NonEmpty.toList)+ codec { Codec.schema = schema }++instance HasCodec Integer where+ codec =+ let schema = Schema.unidentified $ Schema.Integer Nothing Nothing+ in+ Codec.identified $ Codec.mapMaybe+ Decimal.toInteger+ (Just . Decimal.fromInteger)+ codec { Codec.schema = pure schema }++instance HasCodec Int where+ codec = integralCodec++instance HasCodec Int.Int8 where+ codec = integralCodec++instance HasCodec Int.Int16 where+ codec = integralCodec++instance HasCodec Int.Int32 where+ codec = integralCodec++instance HasCodec Int.Int64 where+ codec = integralCodec++instance HasCodec Natural.Natural where+ codec =+ let+ from = Bits.toIntegralSized :: Integer -> Maybe Natural.Natural+ into = fromIntegral :: Natural.Natural -> Integer+ schema = Schema.unidentified $ Schema.Integer (Just 0) Nothing+ in Codec.identified $ Codec.mapMaybe+ from+ (Just . into)+ codec { Codec.schema = pure schema }++instance HasCodec Word where+ codec = integralCodec++instance HasCodec Word.Word8 where+ codec = integralCodec++instance HasCodec Word.Word16 where+ codec = integralCodec++instance HasCodec Word.Word32 where+ codec = integralCodec++instance HasCodec Word.Word64 where+ codec = integralCodec++instance HasCodec Float where+ codec = Codec.identified $ Codec.mapMaybe+ (Just . Decimal.toRealFloat)+ Decimal.fromRealFloat+ codec++instance HasCodec Double where+ codec = Codec.identified $ Codec.mapMaybe+ (Just . Decimal.toRealFloat)+ Decimal.fromRealFloat+ codec++instance HasCodec Pointer.Pointer where+ codec = Codec.identified $ Codec.mapMaybe+ (either (const Nothing) Just+ . Decoder.run Pointer.decode+ . Text.encodeUtf8+ )+ (either (const Nothing) Just+ . Text.decodeUtf8'+ . ByteString.toStrict+ . Builder.toLazyByteString+ . Encoder.run Config.initial+ . Pointer.encode+ )+ codec++instance HasCodec Identifier.Identifier where+ codec =+ let prefix = Text.pack "#/definitions/"+ in+ Codec.identified $ Codec.mapMaybe+ (fmap Identifier.fromText . Text.stripPrefix prefix)+ (Just . mappend prefix . Identifier.toText)+ codec++instance HasCodec Name.Name where+ codec = Codec.identified $ Codec.map Name.fromString Name.toString codec++instance HasCodec Schema.Schema where+ codec =+ let+ trueCodec =+ Codec.mapMaybe+ (const $ Just Schema.True)+ (\x -> case x of+ Schema.True -> Just ()+ _ -> Nothing+ )+ . Codec.literalCodec+ . Value.Boolean+ $ Boolean.fromBool True+ falseCodec =+ Codec.mapMaybe+ (const $ Just Schema.False)+ (\x -> case x of+ Schema.False -> Just ()+ _ -> Nothing+ )+ . Codec.literalCodec+ . Value.Boolean+ $ Boolean.fromBool False+ constCodec =+ Codec.mapMaybe+ (Just . Schema.Const)+ (\x -> case x of+ Schema.Const y -> Just y+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ Codec.required (name "const") codec+ nullCodec =+ Codec.mapMaybe+ (const $ Just Schema.Null)+ (\x -> case x of+ Schema.Null -> Just ()+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ . Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "null"+ booleanCodec =+ Codec.mapMaybe+ (const $ Just Schema.Boolean)+ (\x -> case x of+ Schema.Boolean -> Just ()+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ . Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "boolean"+ numberCodec =+ Codec.mapMaybe+ (const $ Just Schema.Number)+ (\x -> case x of+ Schema.Number -> Just ()+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ . Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "number"+ integerCodec =+ Codec.mapMaybe+ (\(_, y, z) -> Just $ Schema.Integer+ (Optional.toMaybe y)+ (Optional.toMaybe z)+ )+ (\x -> case x of+ Schema.Integer y z ->+ Just+ ( ()+ , Optional.fromMaybe y+ , Optional.fromMaybe z+ )+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ (,,)+ <$> Codec.project+ (\(a, _, _) -> a)+ (Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "integer"+ )+ <*> Codec.project+ (\(_, b, _) -> b)+ (Codec.optional (name "minimum") codec)+ <*> Codec.project+ (\(_, _, c) -> c)+ (Codec.optional (name "maximum") codec)+ stringCodec =+ Codec.mapMaybe+ (\(_, y, z) -> Just $ Schema.String+ (Optional.toMaybe y)+ (Optional.toMaybe z)+ )+ (\x -> case x of+ Schema.String y z ->+ Just+ ( ()+ , Optional.fromMaybe y+ , Optional.fromMaybe z+ )+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ (,,)+ <$> Codec.project+ (\(a, _, _) -> a)+ (Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "string"+ )+ <*> Codec.project+ (\(_, b, _) -> b)+ (Codec.optional (name "minLength") codec)+ <*> Codec.project+ (\(_, _, c) -> c)+ (Codec.optional (name "maxLength") codec)+ arrayCodec =+ Codec.mapMaybe+ (\(_, lo, hi, e, m) -> Just $ Schema.Array+ (Optional.toMaybe lo)+ (Optional.toMaybe hi)+ e+ (Optional.toMaybe m)+ )+ (\x -> case x of+ Schema.Array lo hi e m -> Just+ ( ()+ , Optional.fromMaybe lo+ , Optional.fromMaybe hi+ , e+ , Optional.fromMaybe m+ )+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ (,,,,)+ <$> Codec.project+ (\(a, _, _, _, _) -> a)+ (Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "array"+ )+ <*> Codec.project+ (\(_, b, _, _, _) -> b)+ (Codec.optional (name "minItems") codec)+ <*> Codec.project+ (\(_, _, c, _, _) -> c)+ (Codec.optional (name "maxItems") codec)+ <*> Codec.project+ (\(_, _, _, d, _) -> d)+ (Codec.required (name "items")+ . Codec.withIdentifier+ (Identifier.fromText+ $ Text.pack "OneOf Schema [Schema]"+ )+ $ Codec.mapMaybe+ (Just . Left)+ (either Just $ const Nothing)+ codec+ <|> Codec.mapMaybe+ (Just . Right)+ (either (const Nothing) Just)+ codec+ )+ <*> Codec.project+ (\(_, _, _, _, e) -> e)+ (Codec.optional (name "additionalItems") codec)+ objectCodec =+ Codec.mapMaybe+ (\(_, ps, rs, m) -> Just $ Schema.Object+ (fmap Member.toTuple+ . foldMap Object.toList+ $ Optional.toMaybe ps+ )+ (Maybe.fromMaybe [] $ Optional.toMaybe rs)+ (Optional.toMaybe m)+ )+ (\x -> case x of+ Schema.Object ps rs m -> Just+ ( ()+ , if null ps+ then Optional.nothing+ else Optional.just . Object.fromList $ fmap+ Member.fromTuple+ ps+ , if null rs+ then Optional.nothing+ else Optional.just rs+ , Optional.fromMaybe m+ )+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ (,,,)+ <$> Codec.project+ (\(a, _, _, _) -> a)+ (Codec.required (name "type")+ . Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack "object"+ )+ <*> Codec.project+ (\(_, b, _, _) -> b)+ (Codec.optional (name "properties") codec)+ <*> Codec.project+ (\(_, _, c, _) -> c)+ (Codec.optional (name "required") codec)+ <*> Codec.project+ (\(_, _, _, d) -> d)+ (Codec.optional (name "additionalProperties") codec+ )+ refCodec =+ Codec.mapMaybe+ (Just . Schema.Ref)+ (\x -> case x of+ Schema.Ref y -> Just y+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ Codec.required (name "$ref") codec+ oneOfCodec =+ Codec.mapMaybe+ (Just . Schema.OneOf)+ (\x -> case x of+ Schema.OneOf y -> Just y+ _ -> Nothing+ )+ . Codec.fromObjectCodec Permission.Forbid+ $ Codec.required (name "oneOf") codec+ in+ Codec.identified+ $ trueCodec+ <|> falseCodec+ <|> constCodec+ <|> nullCodec+ <|> booleanCodec+ <|> numberCodec+ <|> integerCodec+ <|> stringCodec+ <|> arrayCodec+ <|> objectCodec+ <|> refCodec+ <|> oneOfCodec++name :: String -> Name.Name+name = Name.fromString . String.fromText . Text.pack++valueCodec+ :: forall a+ . Typeable.Typeable a+ => Schema.Schema+ -> (a -> Value.Value)+ -> (Value.Value -> Maybe a)+ -> Codec.Value a+valueCodec schema toValue fromValue = Codec.identified Codec.Codec+ { Codec.decode = castValue+ (Codec.typeName (Typeable.Proxy :: Typeable.Proxy a))+ fromValue+ , Codec.encode = Codec.tap $ Trans.lift . Trans.put . toValue+ , Codec.schema = pure $ Schema.unidentified schema+ }++castValue+ :: String+ -> (Value.Value -> Maybe a)+ -> Trans.ReaderT+ Value.Value+ (Trans.ExceptT String Identity.Identity)+ a+castValue expected fromValue = do+ value <- Trans.ask+ case fromValue value of+ Nothing -> Trans.lift . Trans.throwE $ typeMismatch expected value+ Just x -> pure x++typeMismatch :: String -> Value.Value -> String+typeMismatch expected value =+ let+ actual = case value of+ Value.Null _ -> "Null"+ Value.Boolean _ -> "Boolean"+ Value.Number _ -> "Number"+ Value.String _ -> "String"+ Value.Array _ -> "Array"+ Value.Object _ -> "Object"+ in "expected " <> expected <> " but got " <> actual++integralCodec+ :: forall a+ . (Bits.Bits a, Bounded a, Integral a, Typeable.Typeable a)+ => Codec.Value a+integralCodec =+ let+ from = Bits.toIntegralSized :: Integer -> Maybe a+ into = fromIntegral :: a -> Integer+ schema = Schema.unidentified $ Schema.Integer+ (Just $ toInteger (minBound :: a))+ (Just $ toInteger (maxBound :: a))+ in Codec.identified $ Codec.mapMaybe+ from+ (Just . into)+ codec { Codec.schema = pure schema }++optionalNullable+ :: Typeable.Typeable a+ => Name.Name+ -> Codec.Value a+ -> Codec.Object (Maybe a)+optionalNullable k =+ Codec.map+ (maybe Nothing Nullable.toMaybe . Optional.toMaybe)+ (Optional.fromMaybe . fmap Nullable.just)+ . Codec.optional k+ . nullable++nullable+ :: Typeable.Typeable a+ => Codec.Value a+ -> Codec.Value (Nullable.Nullable a)+nullable c =+ Codec.identified+ $ Codec.mapMaybe (Just . Nullable.just) Nullable.toMaybe c+ <|> Codec.map (const Nullable.nothing) (const $ Null.fromUnit ()) codec
+ source/library/Argo/Internal/Codec/Array.hs view
@@ -0,0 +1,64 @@+module Argo.Internal.Codec.Array where++import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Codec.List as Codec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Internal.Type.Permission as Permission+import qualified Argo.Vendor.Map as Map+import qualified Argo.Vendor.Transformers as Trans+import qualified Data.Functor.Identity as Identity+import qualified Data.List.NonEmpty as NonEmpty++type Array a = Element a a++type Element a b+ = Codec.Item+ ( Trans.AccumT+ (Map.Map Identifier.Identifier Schema.Schema)+ Identity.Identity+ [(Maybe Identifier.Identifier, Schema.Schema)]+ )+ Value.Value+ a+ b++fromArrayCodec :: Permission.Permission -> Array a -> Codec.Value a+fromArrayCodec =+ Codec.fromListCodec+ (\permission schemasM -> do+ schemas <- schemasM+ pure . Schema.unidentified $ Schema.Array+ (Just . fromIntegral $ length schemas)+ (case permission of+ Permission.Allow -> Nothing+ Permission.Forbid ->+ Just . fromIntegral $ length schemas+ )+ (case NonEmpty.nonEmpty $ fmap Schema.maybeRef schemas of+ Nothing -> Left Schema.False+ Just xs -> Right xs+ )+ Nothing+ )+ $ Codec.map Array.toList Array.fromList Codec.arrayCodec++element :: Codec.Value a -> Array a+element c = Codec.Codec+ { Codec.decode = do+ l <- Trans.get+ case l of+ [] -> Trans.lift $ Trans.throwE "unexpected empty list"+ h : t -> case Codec.decodeWith c h of+ Left y -> Trans.lift $ Trans.throwE y+ Right y -> do+ Trans.put t+ pure y+ , Codec.encode = \x -> do+ Trans.tell [Codec.encodeWith c x]+ pure x+ , Codec.schema = pure . Schema.unidentified <$> Codec.getRef c+ }
+ source/library/Argo/Internal/Codec/Codec.hs view
@@ -0,0 +1,92 @@+{-# LANGUAGE FlexibleInstances #-}++module Argo.Internal.Codec.Codec where++import Control.Applicative ((<|>))++import qualified Control.Applicative as Applicative++data Codec r w s i o = Codec+ { decode :: r o+ , encode :: i -> w o+ , schema :: s+ }++instance (Functor r, Functor w) => Functor (Codec r w s i) where+ fmap f c = Codec+ { decode = f <$> decode c+ , encode = fmap f . encode c+ , schema = schema c+ }++instance+ ( Applicative r+ , Applicative w+ , Applicative s+ , Monoid a+ ) => Applicative (Codec r w (s a) i) where+ pure x = Codec+ { decode = pure x+ , encode = const $ pure x+ , schema = pure mempty+ }+ cf <*> cx = Codec+ { decode = decode cf <*> decode cx+ , encode = \i -> encode cf i <*> encode cx i+ , schema = (<>) <$> schema cf <*> schema cx+ }++instance+ ( Applicative.Alternative r+ , Applicative.Alternative w+ , Applicative s+ , Monoid a+ ) => Applicative.Alternative (Codec r w (s a) i) where+ empty = Codec+ { decode = Applicative.empty+ , encode = const Applicative.empty+ , schema = pure mempty+ }+ cx <|> cy = Codec+ { decode = decode cx <|> decode cy+ , encode = \i -> encode cx i <|> encode cy i+ , schema = (<>) <$> schema cx <*> schema cy+ }++map+ :: (Functor r, Functor w)+ => (a -> b)+ -> (b -> a)+ -> Codec r w s a a+ -> Codec r w s b b+map f g c = Codec+ { decode = f <$> decode c+ , encode = fmap f . encode c . g+ , schema = schema c+ }++mapMaybe+ :: (Applicative.Alternative r, Applicative.Alternative w, Monad r, Monad w)+ => (o2 -> Maybe o1)+ -> (i1 -> Maybe i2)+ -> Codec r w s i2 o2+ -> Codec r w s i1 o1+mapMaybe f g c = Codec+ { decode = do+ o2 <- decode c+ toAlternative $ f o2+ , encode = \i1 -> do+ i2 <- toAlternative $ g i1+ o2 <- encode c i2+ toAlternative $ f o2+ , schema = schema c+ }++project :: (i -> f) -> Codec r w s f o -> Codec r w s i o+project f c = c { encode = encode c . f }++tap :: Functor f => (a -> f b) -> a -> f a+tap f x = x <$ f x++toAlternative :: Applicative.Alternative m => Maybe a -> m a+toAlternative = maybe Applicative.empty pure
+ source/library/Argo/Internal/Codec/List.hs view
@@ -0,0 +1,59 @@+module Argo.Internal.Codec.List where++import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Internal.Type.Permission as Permission+import qualified Argo.Vendor.Map as Map+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified Data.Functor.Identity as Identity++type List s e a = Item s e a a++type Item s e a b+ = Codec.Codec+ (Trans.StateT [e] (Trans.ExceptT String Identity.Identity))+ (Trans.WriterT [e] Identity.Identity)+ s+ a+ b++fromListCodec+ :: ( Permission.Permission+ -> s+ -> Trans.AccumT+ (Map.Map Identifier.Identifier Schema.Schema)+ Identity.Identity+ (Maybe Identifier.Identifier, Schema.Schema)+ )+ -> Codec.Value [e]+ -> Permission.Permission+ -> List s e a+ -> Codec.Value a+fromListCodec f ce p ca = Codec.Codec+ { Codec.decode = do+ xs <- Codec.decode ce+ case+ Identity.runIdentity . Trans.runExceptT $ Trans.runStateT+ (Codec.decode ca)+ xs+ of+ Left x -> Trans.lift $ Trans.throwE x+ Right (x, ys) -> do+ case (p, ys) of+ (Permission.Forbid, _ : _) ->+ Trans.lift $ Trans.throwE "leftover elements"+ _ -> pure ()+ pure x+ , Codec.encode = \x -> do+ Monad.void+ . Codec.encode ce+ . snd+ . Identity.runIdentity+ . Trans.runWriterT+ $ Codec.encode ca x+ pure x+ , Codec.schema = f p $ Codec.schema ca+ }
+ source/library/Argo/Internal/Codec/Object.hs view
@@ -0,0 +1,119 @@+module Argo.Internal.Codec.Object where++import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Codec.List as Codec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Internal.Type.Optional as Optional+import qualified Argo.Internal.Type.Permission as Permission+import qualified Argo.Vendor.Map as Map+import qualified Argo.Vendor.Text as Text+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified Data.Functor.Identity as Identity+import qualified Data.List as List+import qualified Data.Maybe as Maybe++type Object a = Member a a++type Member a b+ = Codec.Item+ ( Trans.AccumT+ (Map.Map Identifier.Identifier Schema.Schema)+ Identity.Identity+ [ ( (Name.Name, Bool)+ , (Maybe Identifier.Identifier, Schema.Schema)+ )+ ]+ )+ (Member.Member Value.Value)+ a+ b++fromObjectCodec :: Permission.Permission -> Object a -> Codec.Value a+fromObjectCodec =+ Codec.fromListCodec+ (\permission schemasM -> do+ schemas <- schemasM+ pure+ . Schema.unidentified+ . Schema.Object+ (fmap+ (\((k, _), s) -> (k, Schema.maybeRef s))+ schemas+ )+ (Maybe.mapMaybe+ (\((k, r), _) -> if r then Just k else Nothing)+ schemas+ )+ $ case permission of+ Permission.Allow -> Nothing+ Permission.Forbid -> Just Schema.False+ )+ $ Codec.map Object.toList Object.fromList Codec.objectCodec++required :: Name.Name -> Codec.Value a -> Object a+required k c = Codec.Codec+ { Codec.decode = do+ m <- Codec.decode (optional k c)+ case Optional.toMaybe m of+ Nothing ->+ Trans.lift+ . Trans.throwE+ $ "missing required member: "+ <> show k+ Just x -> pure x+ , Codec.encode = \x -> do+ Monad.void . Codec.encode (optional k c) $ Optional.just x+ pure x+ , Codec.schema =+ pure . (,) (k, True) . Schema.unidentified <$> Codec.getRef c+ }++optional :: Name.Name -> Codec.Value a -> Object (Optional.Optional a)+optional k c = Codec.Codec+ { Codec.decode = do+ xs <- Trans.get+ case List.partition (\(Member.Member j _) -> j == k) xs of+ (Member.Member _ x : _, ys) -> case Codec.decodeWith c x of+ Left y -> Trans.lift $ Trans.throwE y+ Right y -> do+ Trans.put ys+ pure $ Optional.just y+ _ -> pure Optional.nothing+ , Codec.encode = \x -> do+ case Optional.toMaybe x of+ Nothing -> pure ()+ Just y -> Trans.tell [Member.Member k $ Codec.encodeWith c y]+ pure x+ , Codec.schema =+ pure . (,) (k, False) . Schema.unidentified <$> Codec.getRef c+ }++tagged :: String -> Codec.Value a -> Codec.Value a+tagged t c =+ Codec.map snd ((,) ())+ . fromObjectCodec Permission.Forbid+ $ (,)+ <$> Codec.project+ fst+ (required+ (Name.fromString . String.fromText $ Text.pack "type")+ (Codec.literalCodec+ . Value.String+ . String.fromText+ $ Text.pack t+ )+ )+ <*> Codec.project+ snd+ (required+ (Name.fromString . String.fromText $ Text.pack "value")+ c+ )
+ source/library/Argo/Internal/Codec/Value.hs view
@@ -0,0 +1,124 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Argo.Internal.Codec.Value where++import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Null as Null+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Vendor.Map as Map+import qualified Argo.Vendor.Text as Text+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified Data.Functor.Identity as Identity+import qualified Data.Typeable as Typeable++decodeWith :: Value a -> Value.Value -> Either String a+decodeWith c =+ Identity.runIdentity . Trans.runExceptT . Trans.runReaderT (Codec.decode c)++encodeWith :: Value a -> a -> Value.Value+encodeWith c x =+ snd+ . Identity.runIdentity+ . Trans.runStateT (Trans.runMaybeT $ Codec.encode c x)+ . Value.Null+ $ Null.fromUnit ()++type Value a+ = Codec.Codec+ (Trans.ReaderT Value.Value (Trans.ExceptT String Identity.Identity))+ (Trans.MaybeT (Trans.StateT Value.Value Identity.Identity))+ ( Trans.AccumT+ (Map.Map Identifier.Identifier Schema.Schema)+ Identity.Identity+ (Maybe Identifier.Identifier, Schema.Schema)+ )+ a+ a++arrayCodec :: Value (Array.Array Value.Value)+arrayCodec = Codec.Codec+ { Codec.decode = do+ x <- Trans.ask+ case x of+ Value.Array y -> pure y+ _ ->+ Trans.lift . Trans.throwE $ "expected Array but got " <> show x+ , Codec.encode = \x -> do+ Trans.lift . Trans.put $ Value.Array x+ pure x+ , Codec.schema = pure $ Schema.unidentified Schema.false+ }++objectCodec :: Value (Object.Object Value.Value)+objectCodec = Codec.Codec+ { Codec.decode = do+ x <- Trans.ask+ case x of+ Value.Object y -> pure y+ _ ->+ Trans.lift+ . Trans.throwE+ $ "expected Object but got "+ <> show x+ , Codec.encode = \x -> do+ Trans.lift . Trans.put $ Value.Object x+ pure x+ , Codec.schema = pure $ Schema.unidentified Schema.false+ }++literalCodec :: Value.Value -> Value ()+literalCodec expected = Codec.Codec+ { Codec.decode = do+ actual <- Trans.ask+ Monad.when (actual /= expected)+ . Trans.lift+ . Trans.throwE+ $ "expected "+ <> show expected+ <> " but got "+ <> show actual+ , Codec.encode = const . Trans.lift $ Trans.put expected+ , Codec.schema = pure . Schema.unidentified $ Schema.Const expected+ }++identified :: forall a . Typeable.Typeable a => Value a -> Value a+identified = withIdentifier . Identifier.fromText . Text.pack $ typeName+ (Typeable.Proxy :: Typeable.Proxy a)++withIdentifier :: Identifier.Identifier -> Value a -> Value a+withIdentifier identifier codec =+ let+ newSchema = do+ (_, schema) <- Codec.schema codec+ Trans.add $ Map.singleton identifier schema+ pure $ Schema.withIdentifier identifier schema+ in codec { Codec.schema = newSchema }++typeName :: Typeable.Typeable a => Typeable.Proxy a -> String+typeName = show . Typeable.typeRep++getRef+ :: Value a+ -> Trans.AccumT+ (Map.Map Identifier.Identifier Schema.Schema)+ Identity.Identity+ Schema.Schema+getRef codec = do+ let+ (maybeIdentifier, schema) =+ fst . Identity.runIdentity $ Trans.runAccumT+ (Codec.schema codec)+ Map.empty+ case maybeIdentifier of+ Nothing -> pure schema+ Just identifier -> do+ schemas <- Trans.look+ Monad.unless (Map.member identifier schemas) $ do+ Trans.add $ Map.singleton identifier schema+ Monad.void $ Codec.schema codec+ pure $ Schema.Ref identifier
+ source/library/Argo/Internal/Decode.hs view
@@ -0,0 +1,19 @@+module Argo.Internal.Decode where++import qualified Argo.Internal.Class.HasCodec as HasCodec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Pointer.Pointer as Pointer+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Vendor.ByteString as ByteString++decode :: HasCodec.HasCodec a => ByteString.ByteString -> Either String a+decode x = do+ y <- Decoder.run (Decoder.spaces *> Value.decode) x+ fromValue y++decodePointer :: ByteString.ByteString -> Either String Pointer.Pointer+decodePointer = Decoder.run Pointer.decode++fromValue :: HasCodec.HasCodec a => Value.Value -> Either String a+fromValue = Codec.decodeWith HasCodec.codec
+ source/library/Argo/Internal/Encode.hs view
@@ -0,0 +1,33 @@+module Argo.Internal.Encode where++import qualified Argo.Internal.Class.HasCodec as HasCodec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Pointer.Pointer as Pointer+import qualified Argo.Internal.Type.Config as Config+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Internal.Type.Indent as Indent+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad++encode :: HasCodec.HasCodec a => a -> Builder.Builder+encode = encodeWith $ Indent.Spaces 0++encodeWith :: HasCodec.HasCodec a => Indent.Indent -> a -> Builder.Builder+encodeWith i x =+ let c = Config.initial { Config.indent = i }+ in+ Encoder.run c $ do+ Value.encode $ toValue x+ Monad.when (Config.hasIndent c)+ . Trans.lift+ . Trans.tell+ $ Builder.word8 Literal.newLine++encodePointer :: Pointer.Pointer -> Builder.Builder+encodePointer = Encoder.run Config.initial . Pointer.encode++toValue :: HasCodec.HasCodec a => a -> Value.Value+toValue = Codec.encodeWith HasCodec.codec
+ source/library/Argo/Internal/Json/Array.hs view
@@ -0,0 +1,43 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Array where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Transformers as Trans+import qualified GHC.Generics as Generics++newtype Array value+ = Array [value]+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromList :: [value] -> Array value+fromList = Array++toList :: Array value -> [value]+toList (Array x) = x++encode :: (value -> Encoder.Encoder ()) -> Array value -> Encoder.Encoder ()+encode f =+ Encoder.list+ (Trans.lift . Trans.tell $ Builder.word8 Literal.leftSquareBracket)+ (Trans.lift . Trans.tell $ Builder.word8 Literal.rightSquareBracket+ )+ (Trans.lift . Trans.tell $ Builder.word8 Literal.comma)+ f+ . toList++decode :: Decoder.Decoder value -> Decoder.Decoder (Array value)+decode f = do+ Decoder.word8 Literal.leftSquareBracket+ Decoder.spaces+ xs <- Decoder.list f+ Decoder.word8 Literal.rightSquareBracket+ Decoder.spaces+ pure $ fromList xs
+ source/library/Argo/Internal/Json/Boolean.hs view
@@ -0,0 +1,42 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Boolean where++import Control.Applicative ((<|>))++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Transformers as Trans+import qualified GHC.Generics as Generics++newtype Boolean+ = Boolean Bool+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromBool :: Bool -> Boolean+fromBool = Boolean++toBool :: Boolean -> Bool+toBool (Boolean x) = x++encode :: Boolean -> Encoder.Encoder ()+encode x = Trans.lift . Trans.tell . Builder.byteString $ if toBool x+ then Literal.true+ else Literal.false++decode :: Decoder.Decoder Boolean+decode = decodeFalse <|> decodeTrue++decodeFalse :: Decoder.Decoder Boolean+decodeFalse =+ fromBool False <$ Decoder.byteString Literal.false <* Decoder.spaces++decodeTrue :: Decoder.Decoder Boolean+decodeTrue =+ fromBool True <$ Decoder.byteString Literal.true <* Decoder.spaces
+ source/library/Argo/Internal/Json/Member.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Member where++import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Config as Config+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified GHC.Generics as Generics++data Member value = Member Name.Name value+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromTuple :: (Name.Name, value) -> Member value+fromTuple = uncurry Member++toTuple :: Member value -> (Name.Name, value)+toTuple (Member k v) = (k, v)++encode :: (value -> Encoder.Encoder ()) -> Member value -> Encoder.Encoder ()+encode f (Member x y) = do+ Name.encode x+ Trans.lift . Trans.tell $ Builder.word8 Literal.colon+ config <- Trans.ask+ Monad.when (Config.hasIndent config)+ . Trans.lift+ . Trans.tell+ $ Builder.word8 Literal.space+ f y++decode :: Decoder.Decoder value -> Decoder.Decoder (Member value)+decode g =+ Member+ <$> Name.decode+ <* Decoder.word8 Literal.colon+ <* Decoder.spaces+ <*> g
+ source/library/Argo/Internal/Json/Name.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Name where++import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Data.String+import qualified GHC.Generics as Generics++newtype Name+ = Name String.String+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Ord, Show)++instance Data.String.IsString Name where+ fromString = fromString . Data.String.fromString++fromString :: String.String -> Name+fromString = Name++toString :: Name -> String.String+toString (Name x) = x++encode :: Name -> Encoder.Encoder ()+encode = String.encode . toString++decode :: Decoder.Decoder Name+decode = fromString <$> String.decode
+ source/library/Argo/Internal/Json/Null.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Null where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Transformers as Trans+import qualified GHC.Generics as Generics++newtype Null+ = Null ()+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromUnit :: () -> Null+fromUnit = Null++toUnit :: Null -> ()+toUnit (Null x) = x++encode :: Null -> Encoder.Encoder ()+encode = const . Trans.lift . Trans.tell $ Builder.byteString Literal.null++decode :: Decoder.Decoder Null+decode = fromUnit () <$ Decoder.byteString Literal.null <* Decoder.spaces
+ source/library/Argo/Internal/Json/Number.hs view
@@ -0,0 +1,92 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Number where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decimal as Decimal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.ByteString as ByteString+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Applicative as Applicative+import qualified Control.Monad as Monad+import qualified Data.Bool as Bool+import qualified Data.Maybe as Maybe+import qualified Data.Word as Word+import qualified GHC.Generics as Generics++newtype Number+ = Number Decimal.Decimal+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromDecimal :: Decimal.Decimal -> Number+fromDecimal = Number++toDecimal :: Number -> Decimal.Decimal+toDecimal (Number x) = x++encode :: Number -> Encoder.Encoder ()+encode x = do+ let Decimal.Decimal s e = toDecimal x+ Trans.lift . Trans.tell $ Builder.integerDec s+ Monad.when (e /= 0)+ . Trans.lift+ . Trans.tell+ $ Builder.word8 Literal.latinSmallLetterE+ <> Builder.integerDec e++decode :: Decoder.Decoder Number+decode = do+ ni <- fmap Maybe.isJust . Applicative.optional $ Decoder.word8+ Literal.hyphenMinus+ i <- Decoder.takeWhile1 Decoder.isDigit+ Monad.when+ (ByteString.length i+ > 1+ && ByteString.elemIndex Literal.digitZero i+ == Just 0+ )+ . Trans.lift+ $ Trans.throwE "leading zero"+ f <- fmap (Maybe.fromMaybe ByteString.empty) . Applicative.optional $ do+ Decoder.word8 Literal.fullStop+ Decoder.takeWhile1 Decoder.isDigit+ (ne, e) <-+ fmap (Maybe.fromMaybe (False, ByteString.empty))+ . Applicative.optional+ $ do+ Monad.void+ . Decoder.satisfy+ $ \x ->+ (x == Literal.latinSmallLetterE)+ || (x == Literal.latinCapitalLetterE)+ ne <-+ fmap (== Just Literal.hyphenMinus)+ . Applicative.optional+ . Decoder.satisfy+ $ \x -> x == Literal.hyphenMinus || x == Literal.plusSign+ e <- Decoder.takeWhile1 Decoder.isDigit+ pure (ne, e)+ Decoder.spaces+ pure . fromDecimal $ Decimal.decimal+ (negateIf ni $ (fromDigits i * 10 ^ ByteString.length f) + fromDigits f+ )+ (negateIf ne (fromDigits e) - intToInteger (ByteString.length f))++negateIf :: Bool -> Integer -> Integer+negateIf = Bool.bool id negate++fromDigits :: ByteString.ByteString -> Integer+fromDigits =+ ByteString.foldl' (\a e -> (a * 10) + word8ToInteger (e - 0x30)) 0++intToInteger :: Int -> Integer+intToInteger = fromIntegral++word8ToInteger :: Word.Word8 -> Integer+word8ToInteger = fromIntegral
+ source/library/Argo/Internal/Json/Object.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Object where++import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified GHC.Generics as Generics++newtype Object value+ = Object [Member.Member value]+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromList :: [Member.Member value] -> Object value+fromList = Object++toList :: Object value -> [Member.Member value]+toList (Object x) = x++encode :: (value -> Encoder.Encoder ()) -> Object value -> Encoder.Encoder ()+encode f =+ Encoder.list+ (Trans.lift . Trans.tell $ Builder.word8 Literal.leftCurlyBracket)+ (Trans.lift . Trans.tell $ Builder.word8 Literal.rightCurlyBracket)+ (Trans.lift . Trans.tell $ Builder.word8 Literal.comma)+ (Member.encode f)+ . toList++encodeElement+ :: (value -> Encoder.Encoder ())+ -> Int+ -> Member.Member value+ -> Encoder.Encoder ()+encodeElement f i x = do+ Monad.when (i > 0) . Trans.lift . Trans.tell $ Builder.word8 Literal.comma+ Member.encode f x++decode :: Decoder.Decoder value -> Decoder.Decoder (Object value)+decode f = do+ Decoder.word8 Literal.leftCurlyBracket+ Decoder.spaces+ xs <- Decoder.list $ Member.decode f+ Decoder.word8 Literal.rightCurlyBracket+ Decoder.spaces+ pure $ fromList xs
+ source/library/Argo/Internal/Json/String.hs view
@@ -0,0 +1,179 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.String where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.ByteString as ByteString+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Text as Text+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified Data.Char as Char+import qualified Data.String as String+import qualified Data.Word as Word+import qualified GHC.Generics as Generics++newtype String+ = String Text.Text+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Ord, Show)++instance String.IsString Argo.Internal.Json.String.String where+ fromString = fromText . String.fromString++fromText :: Text.Text -> Argo.Internal.Json.String.String+fromText = String++toText :: Argo.Internal.Json.String.String -> Text.Text+toText (String x) = x++encode :: Argo.Internal.Json.String.String -> Encoder.Encoder ()+encode x =+ Trans.lift+ . Trans.tell+ $ Builder.word8 Literal.quotationMark+ <> Text.encodeUtf8BuilderEscaped encodeChar (toText x)+ <> Builder.word8 Literal.quotationMark++encodeChar :: Builder.BoundedPrim Word.Word8+encodeChar =+ Builder.condB+ (== Literal.quotationMark)+ (encodeShortEscape Literal.quotationMark)+ . Builder.condB+ (== Literal.reverseSolidus)+ (encodeShortEscape Literal.reverseSolidus)+ . Builder.condB+ (== Literal.backspace)+ (encodeShortEscape Literal.latinSmallLetterB)+ . Builder.condB+ (== Literal.formFeed)+ (encodeShortEscape Literal.latinSmallLetterF)+ . Builder.condB+ (== Literal.newLine)+ (encodeShortEscape Literal.latinSmallLetterN)+ . Builder.condB+ (== Literal.carriageReturn)+ (encodeShortEscape Literal.latinSmallLetterR)+ . Builder.condB+ (== Literal.horizontalTabulation)+ (encodeShortEscape Literal.latinSmallLetterT)+ . Builder.condB (< Literal.space) encodeLongEscape+ $ Builder.liftFixedToBounded Builder.word8F++encodeShortEscape :: Word.Word8 -> Builder.BoundedPrim a+encodeShortEscape x =+ Builder.liftFixedToBounded+ $ const (Literal.reverseSolidus, x)+ Builder.>$< Builder.word8F+ Builder.>*< Builder.word8F++encodeLongEscape :: Builder.BoundedPrim Word.Word8+encodeLongEscape =+ Builder.liftFixedToBounded+ $ (\x ->+ ( Literal.reverseSolidus+ , (Literal.latinSmallLetterU, word8ToWord16 x)+ )+ )+ Builder.>$< Builder.word8F+ Builder.>*< Builder.word8F+ Builder.>*< Builder.word16HexFixed++word8ToWord16 :: Word.Word8 -> Word.Word16+word8ToWord16 = fromIntegral++decode :: Decoder.Decoder Argo.Internal.Json.String.String+decode = do+ Decoder.word8 Literal.quotationMark+ b1 <- Trans.get+ i <- case getClose b1 0 of+ Nothing -> Trans.lift $ Trans.throwE "unterminated string"+ Just i -> pure i+ let (xs, b2) = ByteString.splitAt i b1+ Monad.when (ByteString.any (< Literal.space) xs)+ . Trans.lift+ $ Trans.throwE "unescaped control character"+ Trans.put b2+ Decoder.word8 Literal.quotationMark+ Decoder.spaces+ case Text.decodeUtf8' xs of+ Left e -> Trans.lift . Trans.throwE $ show e+ Right x -> case unescapeText x of+ Left e -> Trans.lift $ Trans.throwE e+ Right y -> pure $ fromText y++findAt :: Word.Word8 -> Int -> ByteString.ByteString -> Maybe Int+findAt x i = fmap (+ i) . ByteString.elemIndex x . ByteString.drop i++countConsecutive :: Word.Word8 -> Int -> ByteString.ByteString -> Int+countConsecutive x i =+ ByteString.length . ByteString.takeWhileEnd (== x) . ByteString.take i++getClose :: ByteString.ByteString -> Int -> Maybe Int+getClose b i = do+ j <- findAt Literal.quotationMark i b+ let n = countConsecutive Literal.reverseSolidus j b+ if even n then Just j else getClose b $ j + 1++unescapeText :: Text.Text -> Either Prelude.String Text.Text+unescapeText =+ fmap (Text.pack . combineSurrogatePairs) . unescapeString . Text.unpack++combineSurrogatePairs :: Prelude.String -> Prelude.String+combineSurrogatePairs xs = case xs of+ "" -> xs+ x : y : zs | isHighSurrogate x && isLowSurrogate y ->+ combineSurrogatePair x y : combineSurrogatePairs zs+ x : ys -> x : combineSurrogatePairs ys++combineSurrogatePair :: Char -> Char -> Char+combineSurrogatePair hi lo =+ Char.chr+ $ 0x10000+ + ((Char.ord hi - 0xd800) * 0x400)+ + (Char.ord lo - 0xdc00)++isHighSurrogate :: Char -> Bool+isHighSurrogate x = '\xd800' <= x && x <= '\xdbff'++isLowSurrogate :: Char -> Bool+isLowSurrogate x = '\xdc00' <= x && x <= '\xdfff'++unescapeString :: Prelude.String -> Either Prelude.String Prelude.String+unescapeString xs = case xs of+ "" -> pure xs+ '\\' : ys -> case ys of+ "" -> Left "empty escape"+ x : zs -> case x of+ '"' -> ('"' :) <$> unescapeString zs+ '\\' -> ('\\' :) <$> unescapeString zs+ '/' -> ('/' :) <$> unescapeString zs+ 'b' -> ('\b' :) <$> unescapeString zs+ 'f' -> ('\f' :) <$> unescapeString zs+ 'n' -> ('\n' :) <$> unescapeString zs+ 'r' -> ('\r' :) <$> unescapeString zs+ 't' -> ('\t' :) <$> unescapeString zs+ 'u' -> case zs of+ a : b : c : d : es | Just y <- fromLongEscape a b c d ->+ (y :) <$> unescapeString es+ _ -> Left "invalid long escape"+ _ -> Left "invalid short escape"+ x : ys -> (x :) <$> unescapeString ys++fromLongEscape :: Char -> Char -> Char -> Char -> Maybe Char+fromLongEscape a b c d = do+ w <- fromHexadecimalDigit a+ x <- fromHexadecimalDigit b+ y <- fromHexadecimalDigit c+ z <- fromHexadecimalDigit d+ pure . Char.chr $ (0x1000 * w) + (0x100 * x) + (0x10 * y) + z++fromHexadecimalDigit :: Char -> Maybe Int+fromHexadecimalDigit x =+ if Char.isHexDigit x then Just $ Char.digitToInt x else Nothing
+ source/library/Argo/Internal/Json/Value.hs view
@@ -0,0 +1,52 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Json.Value where++import Control.Applicative ((<|>))++import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Boolean as Boolean+import qualified Argo.Internal.Json.Null as Null+import qualified Argo.Internal.Json.Number as Number+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Data.String+import qualified GHC.Generics as Generics++-- | A JSON (JavaScript Object Notation) value, as described by RFC 8259.+-- <https://datatracker.ietf.org/doc/html/rfc8259>+data Value+ = Null Null.Null+ | Boolean Boolean.Boolean+ | Number Number.Number+ | String String.String+ | Array (Array.Array Value)+ | Object (Object.Object Value)+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++instance Data.String.IsString Value where+ fromString = String . Data.String.fromString++encode :: Value -> Encoder.Encoder ()+encode x = case x of+ Null y -> Null.encode y+ Boolean y -> Boolean.encode y+ Number y -> Number.encode y+ String y -> String.encode y+ Array y -> Array.encode encode y+ Object y -> Object.encode encode y++decode :: Decoder.Decoder Value+decode =+ (Null <$> Null.decode)+ <|> (Boolean <$> Boolean.decode)+ <|> (Number <$> Number.decode)+ <|> (String <$> String.decode)+ <|> (Array <$> Array.decode decode)+ <|> (Object <$> Object.decode decode)
+ source/library/Argo/Internal/Literal.hs view
@@ -0,0 +1,103 @@+module Argo.Internal.Literal where++import qualified Argo.Vendor.ByteString as ByteString+import qualified Data.Word as Word++backspace :: Word.Word8+backspace = 0x08++carriageReturn :: Word.Word8+carriageReturn = 0x0d++colon :: Word.Word8+colon = 0x3a++comma :: Word.Word8+comma = 0x2c++digitNine :: Word.Word8+digitNine = 0x39++digitOne :: Word.Word8+digitOne = 0x31++digitZero :: Word.Word8+digitZero = 0x30++false :: ByteString.ByteString+false = ByteString.pack [0x66, 0x61, 0x6c, 0x73, 0x65]++formFeed :: Word.Word8+formFeed = 0x0c++fullStop :: Word.Word8+fullStop = 0x2e++horizontalTabulation :: Word.Word8+horizontalTabulation = 0x09++hyphenMinus :: Word.Word8+hyphenMinus = 0x2d++latinCapitalLetterE :: Word.Word8+latinCapitalLetterE = 0x45++latinSmallLetterB :: Word.Word8+latinSmallLetterB = 0x62++latinSmallLetterE :: Word.Word8+latinSmallLetterE = 0x65++latinSmallLetterF :: Word.Word8+latinSmallLetterF = 0x66++latinSmallLetterN :: Word.Word8+latinSmallLetterN = 0x6e++latinSmallLetterR :: Word.Word8+latinSmallLetterR = 0x72++latinSmallLetterT :: Word.Word8+latinSmallLetterT = 0x74++latinSmallLetterU :: Word.Word8+latinSmallLetterU = 0x75++leftCurlyBracket :: Word.Word8+leftCurlyBracket = 0x7b++leftSquareBracket :: Word.Word8+leftSquareBracket = 0x5b++newLine :: Word.Word8+newLine = 0x0a++null :: ByteString.ByteString+null = ByteString.pack [0x6e, 0x75, 0x6c, 0x6c]++plusSign :: Word.Word8+plusSign = 0x2b++quotationMark :: Word.Word8+quotationMark = 0x22++reverseSolidus :: Word.Word8+reverseSolidus = 0x5c++rightCurlyBracket :: Word.Word8+rightCurlyBracket = 0x7d++rightSquareBracket :: Word.Word8+rightSquareBracket = 0x5d++solidus :: Word.Word8+solidus = 0x2f++space :: Word.Word8+space = 0x20++tilde :: Word.Word8+tilde = 0x7e++true :: ByteString.ByteString+true = ByteString.pack [0x74, 0x72, 0x75, 0x65]
+ source/library/Argo/Internal/Main.hs view
@@ -0,0 +1,88 @@+module Argo.Internal.Main where++import qualified Argo.Internal.Decode as Decode+import qualified Argo.Internal.Encode as Encode+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Type.Flag as Flag+import qualified Argo.Internal.Type.Settings as Settings+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.ByteString as ByteString+import qualified Control.Monad as Monad+import qualified Data.Version as Version+import qualified Paths_argo as This+import qualified System.Console.GetOpt as Console+import qualified System.Environment as Environment+import qualified System.Exit as Exit+import qualified System.IO as IO++main :: IO ()+main = do+ name <- Environment.getProgName+ arguments <- Environment.getArgs+ mainWith name arguments++mainWith :: String -> [String] -> IO ()+mainWith name arguments = do+ let ((warnings, errors), flags) = getFlags arguments+ mapM_ (IO.hPutStrLn IO.stderr) warnings+ mapM_ (IO.hPutStr IO.stderr) errors+ Monad.unless (null errors) Exit.exitFailure++ withSettings name flags $ \settings -> do+ contents <- ByteString.getContents+ value <- case Decode.decode contents of+ Left e -> fail e+ Right x -> pure (x :: Value.Value)+ Builder.hPutBuilder IO.stdout+ $ Encode.encodeWith (Settings.indent settings) value++getFlags :: [String] -> (([String], [String]), [Flag.Flag])+getFlags arguments =+ let+ (flags, xs, ys, errors) =+ Console.getOpt' Console.Permute options arguments+ warnings =+ fmap (mappend "unknown argument " . quote) xs+ <> fmap (mappend "unknown option " . quote) ys+ in ((warnings, errors), flags)++withSettings :: String -> [Flag.Flag] -> (Settings.Settings -> IO ()) -> IO ()+withSettings name flags callback = do+ settings <- either fail pure+ $ Monad.foldM Settings.applyFlag Settings.initial flags+ if Settings.help settings+ then putStr+ $ Console.usageInfo (name <> " version " <> version) options+ else if Settings.version settings+ then putStrLn version+ else callback settings++quote :: String -> String+quote x = "`" <> x <> "'"++version :: String+version = Version.showVersion This.version++options :: [Console.OptDescr Flag.Flag]+options =+ [ Console.Option+ ['h', '?']+ ["help"]+ (Console.NoArg Flag.Help)+ "shows this help message and exits"+ , Console.Option+ ['v']+ ["version"]+ (Console.NoArg Flag.Version)+ "shows the version number and exits"+ , Console.Option+ ['s']+ ["spaces"]+ (Console.ReqArg Flag.Spaces "INT")+ "pretty-prints the output using INT sapces"+ , Console.Option+ ['t']+ ["tab"]+ (Console.NoArg Flag.Tab)+ "pretty-prints the output using tabs"+ ]
+ source/library/Argo/Internal/Pattern.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE PatternSynonyms #-}++module Argo.Internal.Pattern where++import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Boolean as Boolean+import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.Null as Null+import qualified Argo.Internal.Json.Number as Number+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Type.Decimal as Decimal+import qualified Argo.Vendor.Text as Text++pattern Null :: Value.Value+pattern Null = Value.Null (Null.Null ())++pattern Boolean :: Bool -> Value.Value+pattern Boolean x = Value.Boolean (Boolean.Boolean x)++pattern Number :: Decimal.Decimal -> Value.Value+pattern Number x = Value.Number (Number.Number x)++pattern String :: Text.Text -> Value.Value+pattern String x = Value.String (String.String x)++pattern Array :: [Value.Value] -> Value.Value+pattern Array x = Value.Array (Array.Array x)++pattern Object :: [Member.Member Value.Value] -> Value.Value+pattern Object x = Value.Object (Object.Object x)++{-# COMPLETE Null, Boolean, Number, String, Array, Object #-}++pattern Name :: Text.Text -> Name.Name+pattern Name x = Name.Name (String.String x)++{-# COMPLETE Name #-}++pattern Decimal :: Integer -> Integer -> Decimal.Decimal+pattern Decimal s e <- Decimal.Decimal s e where+ Decimal s e = Decimal.decimal s e++{-# COMPLETE Decimal #-}
+ source/library/Argo/Internal/Pointer/Pointer.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Pointer.Pointer where++import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Pointer.Token as Token+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Text as Text+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Applicative as Applicative+import qualified Data.List as List+import qualified GHC.Generics as Generics+import qualified Text.Read as Read++-- | A JSON pointer, as described by RFC 6901.+-- <https://datatracker.ietf.org/doc/html/rfc6901>+newtype Pointer+ = Pointer [Token.Token]+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++fromList :: [Token.Token] -> Pointer+fromList = Pointer++toList :: Pointer -> [Token.Token]+toList (Pointer x) = x++decode :: Decoder.Decoder Pointer+decode = fromList <$> Applicative.many decodeToken++decodeToken :: Decoder.Decoder Token.Token+decodeToken = do+ Decoder.word8 Literal.solidus+ Token.decode++encode :: Pointer -> Encoder.Encoder ()+encode = mapM_ encodeToken . toList++encodeToken :: Token.Token -> Encoder.Encoder ()+encodeToken x = do+ Trans.lift . Trans.tell $ Builder.word8 Literal.solidus+ Token.encode x++evaluate :: Pointer -> Value.Value -> Either String Value.Value+evaluate p v = case toList p of+ [] -> pure v+ t : ts -> do+ w <- case v of+ Value.Array a -> atIndex t a+ Value.Object o -> atKey t o+ _ -> Left "not indexable"+ evaluate (fromList ts) w++atIndex :: Token.Token -> Array.Array value -> Either String value+atIndex t a = do+ i <- tokenToIndex t+ case drop i $ Array.toList a of+ [] -> Left $ "missing index: " <> show t+ e : _ -> pure e++tokenToIndex :: Token.Token -> Either String Int+tokenToIndex token = do+ let text = Token.toText token+ invalid = "invalid index: " <> show token+ case Text.uncons text of+ Just ('0', rest) -> if Text.null rest then pure 0 else Left invalid+ _ -> maybe (Left invalid) pure . Read.readMaybe $ Text.unpack text++atKey :: Token.Token -> Object.Object value -> Either String value+atKey t =+ maybe (Left $ "missing key: " <> show t) (\(Member.Member _ v) -> pure v)+ . List.find+ (\(Member.Member k _) ->+ String.toText (Name.toString k) == Token.toText t+ )+ . Object.toList
+ source/library/Argo/Internal/Pointer/Token.hs view
@@ -0,0 +1,72 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Pointer.Token where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Decoder as Decoder+import qualified Argo.Internal.Type.Encoder as Encoder+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.ByteString as ByteString+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Text as Text+import qualified Argo.Vendor.Transformers as Trans+import qualified Data.String as String+import qualified Data.Word as Word+import qualified GHC.Generics as Generics++newtype Token+ = Token Text.Text+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++instance String.IsString Token where+ fromString = fromText . String.fromString++fromText :: Text.Text -> Token+fromText = Token++toText :: Token -> Text.Text+toText (Token x) = x++decode :: Decoder.Decoder Token+decode = do+ x <- Decoder.takeWhile $ (/=) Literal.solidus+ y <- either (Trans.lift . Trans.throwE) pure $ unescape x+ case Text.decodeUtf8' y of+ Left e -> Trans.lift . Trans.throwE $ show e+ Right z -> pure $ fromText z++unescape :: ByteString.ByteString -> Either String ByteString.ByteString+unescape = fmap ByteString.pack . unescapeHelper . ByteString.unpack++unescapeHelper :: [Word.Word8] -> Either String [Word.Word8]+unescapeHelper xs = case xs of+ [] -> pure xs+ x : ys -> if x == Literal.tilde+ then case ys of+ y : zs+ | y == Literal.digitZero+ -> (:) Literal.tilde <$> unescapeHelper zs+ | y == Literal.digitOne+ -> (:) Literal.solidus <$> unescapeHelper zs+ _ -> Left "invalid escape"+ else (:) x <$> unescapeHelper ys++encode :: Token -> Encoder.Encoder ()+encode =+ Trans.lift . Trans.tell . Text.encodeUtf8BuilderEscaped encodeChar . toText++encodeChar :: Builder.BoundedPrim Word.Word8+encodeChar =+ Builder.condB (== Literal.tilde) (encodeEscape Literal.digitZero)+ . Builder.condB (== Literal.solidus) (encodeEscape Literal.digitOne)+ $ Builder.liftFixedToBounded Builder.word8F++encodeEscape :: Word.Word8 -> Builder.BoundedPrim a+encodeEscape x =+ Builder.liftFixedToBounded+ $ const (Literal.tilde, x)+ Builder.>$< Builder.word8F+ Builder.>*< Builder.word8F
+ source/library/Argo/Internal/QuasiQuoter.hs view
@@ -0,0 +1,35 @@+module Argo.Internal.QuasiQuoter where++import qualified Argo.Internal.Decode as Decode+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Text as Text++pointer :: TH.QuasiQuoter+pointer = defaultQuasiQuoter+ { TH.quoteExp =+ either fail TH.lift+ . Decode.decodePointer+ . Text.encodeUtf8+ . Text.pack+ }++value :: TH.QuasiQuoter+value = defaultQuasiQuoter+ { TH.quoteExp =+ either fail (TH.lift . asValue)+ . Decode.decode+ . Text.encodeUtf8+ . Text.pack+ }++asValue :: Value.Value -> Value.Value+asValue = id++defaultQuasiQuoter :: TH.QuasiQuoter+defaultQuasiQuoter = TH.QuasiQuoter+ { TH.quoteDec = const $ fail "cannot be used as a declaration"+ , TH.quoteExp = const $ fail "cannot be used as an expression"+ , TH.quotePat = const $ fail "cannot be used as a pattern"+ , TH.quoteType = const $ fail "cannot be used as a type"+ }
+ source/library/Argo/Internal/Schema/Identifier.hs view
@@ -0,0 +1,27 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Schema.Identifier where++import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Text as Text+import qualified Data.String as String+import qualified GHC.Generics as Generics++newtype Identifier+ = Identifier Text.Text+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Ord, Show)++instance String.IsString Identifier where+ fromString = fromText . String.fromString++instance Semigroup Identifier where+ x <> y = fromText $ toText x <> toText y++fromText :: Text.Text -> Identifier+fromText = Identifier++toText :: Identifier -> Text.Text+toText (Identifier x) = x
+ source/library/Argo/Internal/Schema/Schema.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Schema.Schema where++import qualified Argo.Internal.Json.Member as Member+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Json.Value as Value+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Argo.Vendor.Text as Text+import qualified Data.List.NonEmpty as NonEmpty+import qualified GHC.Generics as Generics+import qualified Numeric.Natural as Natural++-- | A JSON Schema.+-- <https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01>+data Schema+ = Array+ (Maybe Natural.Natural)+ (Maybe Natural.Natural)+ (Either Schema (NonEmpty.NonEmpty Schema))+ (Maybe Schema)+ | Boolean+ | Const Value.Value+ | False+ | Integer (Maybe Integer) (Maybe Integer)+ | Null+ | Number+ | Object [(Name.Name, Schema)] [Name.Name] (Maybe Schema)+ | OneOf [Schema]+ | Ref Identifier.Identifier+ | String (Maybe Natural.Natural) (Maybe Natural.Natural)+ | True+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++instance Semigroup Schema where+ x <> y = case (x, y) of+ (OneOf xs, OneOf ys) -> OneOf $ xs <> ys+ (OneOf xs, _) -> OneOf $ y : xs+ (_, OneOf ys) -> OneOf $ x : ys+ (_, _) -> OneOf [x, y]++instance Monoid Schema where+ mempty = Argo.Internal.Schema.Schema.True++member :: String -> a -> Member.Member a+member k v =+ Member.fromTuple (Name.fromString . String.fromText $ Text.pack k, v)++maybeRef :: (Maybe Identifier.Identifier, Schema) -> Schema+maybeRef (m, s) = maybe s Ref m++false :: Schema+false = Argo.Internal.Schema.Schema.False++true :: Schema+true = Argo.Internal.Schema.Schema.True++unidentified :: Schema -> (Maybe Identifier.Identifier, Schema)+unidentified s = (Nothing, s)++withIdentifier+ :: Identifier.Identifier -> Schema -> (Maybe Identifier.Identifier, Schema)+withIdentifier i s = (Just i, s)
+ source/library/Argo/Internal/Type/Config.hs view
@@ -0,0 +1,20 @@+module Argo.Internal.Type.Config where++import qualified Argo.Internal.Type.Indent as Indent++data Config = Config+ { indent :: Indent.Indent+ , level :: Int+ }+ deriving (Eq, Show)++initial :: Config+initial = Config { indent = Indent.Spaces 0, level = 0 }++hasIndent :: Config -> Bool+hasIndent x = case indent x of+ Indent.Spaces y -> y > 0+ Indent.Tab -> True++increaseLevel :: Config -> Config+increaseLevel x = x { level = level x + 1 }
+ source/library/Argo/Internal/Type/Decimal.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Type.Decimal where++import Data.Ratio ((%))++import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified Data.List as List+import qualified Data.Ratio as Ratio+import qualified GHC.Generics as Generics+import qualified Numeric++data Decimal = Decimal Integer Integer+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++negate :: Decimal -> Decimal+negate (Decimal s e) = Decimal (-s) e++decimal :: Integer -> Integer -> Decimal+decimal s = normalize . Decimal s++normalize :: Decimal -> Decimal+normalize (Decimal s e) = if s == 0+ then Decimal 0 0+ else+ let (q, r) = quotRem s 10+ in if r == 0 then normalize $ Decimal q (e + 1) else Decimal s e++fromInteger :: Integer -> Decimal+fromInteger = flip decimal 0++toInteger :: Decimal -> Maybe Integer+toInteger (Decimal s e) = if e < 0 then Nothing else Just $ s * 10 ^ e++fromRealFloat :: RealFloat a => a -> Maybe Decimal+fromRealFloat x = if isNaN x || isInfinite x+ then Nothing+ else+ Just+ . (if x < 0 then Argo.Internal.Type.Decimal.negate else id)+ . uncurry fromDigits+ . Numeric.floatToDigits 10+ $ abs x++toRealFloat :: RealFloat a => Decimal -> a+toRealFloat = Prelude.fromRational . Argo.Internal.Type.Decimal.toRational++fromDigits :: [Int] -> Int -> Decimal+fromDigits ds e = uncurry decimal $ List.foldl'+ (\(a, n) d -> (a * 10 + Prelude.toInteger d, n - 1))+ (0, Prelude.toInteger e)+ ds++toRational :: Decimal -> Rational+toRational d@(Decimal s e) = maybe (s % (10 ^ (-e))) fromIntegral+ $ Argo.Internal.Type.Decimal.toInteger d++fromRational :: Rational -> Maybe Decimal+fromRational r =+ let+ n = Ratio.numerator r+ d1 = Ratio.denominator r+ (t, d2) = factor 2 (0 :: Integer) d1+ (f, d3) = factor 5 (0 :: Integer) d2+ p = max t f+ in if d3 == 1+ then Just $ decimal (n * 2 ^ (p - t) * 5 ^ (p - f)) (-p)+ else Nothing++-- factor d 0 x = (p, y) <=> x = (d ^ p) * y+factor :: (Num a, Integral b) => b -> a -> b -> (a, b)+factor d n x =+ let (q, r) = quotRem x d+ in if x /= 0 && r == 0 then factor d (n + 1) q else (n, x)
+ source/library/Argo/Internal/Type/Decoder.hs view
@@ -0,0 +1,92 @@+module Argo.Internal.Type.Decoder where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Vendor.ByteString as ByteString+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Applicative as Applicative+import qualified Control.Monad as Monad+import qualified Data.Functor.Identity as Identity+import qualified Data.Word as Word++type Decoder+ = Trans.StateT+ ByteString.ByteString+ (Trans.ExceptT String Identity.Identity)++unwrap+ :: Decoder a+ -> ByteString.ByteString+ -> Either String (a, ByteString.ByteString)+unwrap d = Identity.runIdentity . Trans.runExceptT . Trans.runStateT d++run :: Decoder a -> ByteString.ByteString -> Either String a+run d = fmap fst . unwrap (d <* eof)++list :: Decoder a -> Decoder [a]+list f = listWith f []++listWith :: Decoder a -> [a] -> Decoder [a]+listWith f xs = do+ m <- Applicative.optional $ do+ Monad.unless (null xs) $ do+ word8 Literal.comma+ spaces+ f+ case m of+ Nothing -> pure $ reverse xs+ Just x -> listWith f $ x : xs++byteString :: ByteString.ByteString -> Decoder ()+byteString x = do+ b1 <- Trans.get+ case ByteString.stripPrefix x b1 of+ Nothing -> Trans.lift . Trans.throwE $ "byteString: " <> show x+ Just b2 -> Trans.put b2++dropWhile :: (Word.Word8 -> Bool) -> Decoder ()+dropWhile f = do+ b <- Trans.get+ Trans.put $ ByteString.dropWhile f b++eof :: Decoder ()+eof = do+ b <- Trans.get+ Monad.unless (ByteString.null b) . Trans.lift $ Trans.throwE "eof"++isDigit :: Word.Word8 -> Bool+isDigit x = Literal.digitZero <= x && x <= Literal.digitNine++isSpace :: Word.Word8 -> Bool+isSpace x =+ (x == Literal.space)+ || (x == Literal.horizontalTabulation)+ || (x == Literal.newLine)+ || (x == Literal.carriageReturn)++satisfy :: (Word.Word8 -> Bool) -> Decoder Word.Word8+satisfy f = do+ b1 <- Trans.get+ case ByteString.uncons b1 of+ Just (x, b2) | f x -> do+ Trans.put b2+ pure x+ _ -> Trans.lift $ Trans.throwE "satisfy"++spaces :: Decoder ()+spaces = Argo.Internal.Type.Decoder.dropWhile isSpace++takeWhile :: (Word.Word8 -> Bool) -> Decoder ByteString.ByteString+takeWhile f = do+ b1 <- Trans.get+ let (x, b2) = ByteString.span f b1+ Trans.put b2+ pure x++takeWhile1 :: (Word.Word8 -> Bool) -> Decoder ByteString.ByteString+takeWhile1 f = do+ x <- Argo.Internal.Type.Decoder.takeWhile f+ Monad.when (ByteString.null x) . Trans.lift $ Trans.throwE "takeWhile1"+ pure x++word8 :: Word.Word8 -> Decoder ()+word8 = Monad.void . satisfy . (==)
+ source/library/Argo/Internal/Type/Encoder.hs view
@@ -0,0 +1,61 @@+module Argo.Internal.Type.Encoder where++import qualified Argo.Internal.Literal as Literal+import qualified Argo.Internal.Type.Config as Config+import qualified Argo.Internal.Type.Indent as Indent+import qualified Argo.Vendor.Builder as Builder+import qualified Argo.Vendor.Transformers as Trans+import qualified Control.Monad as Monad+import qualified Data.Functor.Identity as Identity+import qualified Data.Semigroup as Semigroup++type Encoder+ = Trans.ReaderT+ Config.Config+ (Trans.WriterT Builder.Builder Identity.Identity)++unwrap :: Config.Config -> Encoder a -> (a, Builder.Builder)+unwrap c = Identity.runIdentity . Trans.runWriterT . flip Trans.runReaderT c++run :: Config.Config -> Encoder a -> Builder.Builder+run c = snd . unwrap c++list+ :: Encoder ()+ -> Encoder ()+ -> Encoder ()+ -> (a -> Encoder ())+ -> [a]+ -> Encoder ()+list left right separator encode xs = do+ left+ case xs of+ [] -> pure ()+ x : ys -> do+ Trans.local Config.increaseLevel $ do+ maybeIndent <- makeIndent <$> Trans.ask+ withNewLine maybeIndent+ encode x+ Monad.forM_ ys $ \y -> do+ separator+ withNewLine maybeIndent+ encode y+ maybeIndent <- makeIndent <$> Trans.ask+ withNewLine maybeIndent+ right++makeIndent :: Config.Config -> Maybe Builder.Builder+makeIndent config = case Config.indent config of+ Indent.Spaces spaces -> if spaces <= 0+ then Nothing+ else+ Just+ . Semigroup.stimesMonoid (Config.level config * spaces)+ $ Builder.word8 Literal.space+ Indent.Tab ->+ Just . Semigroup.stimesMonoid (Config.level config) $ Builder.word8+ Literal.horizontalTabulation++withNewLine :: Maybe Builder.Builder -> Encoder ()+withNewLine = maybe (pure ()) $ Trans.lift . Trans.tell . mappend+ (Builder.word8 Literal.newLine)
+ source/library/Argo/Internal/Type/Flag.hs view
@@ -0,0 +1,8 @@+module Argo.Internal.Type.Flag where++data Flag+ = Help+ | Spaces String+ | Tab+ | Version+ deriving (Eq, Show)
+ source/library/Argo/Internal/Type/Indent.hs view
@@ -0,0 +1,6 @@+module Argo.Internal.Type.Indent where++data Indent+ = Spaces Int+ | Tab+ deriving (Eq, Show)
+ source/library/Argo/Internal/Type/Nullable.hs view
@@ -0,0 +1,17 @@+module Argo.Internal.Type.Nullable where++newtype Nullable a+ = Nullable (Maybe a)+ deriving (Eq, Show)++fromMaybe :: Maybe a -> Nullable a+fromMaybe = Nullable++toMaybe :: Nullable a -> Maybe a+toMaybe (Nullable x) = x++nothing :: Nullable a+nothing = fromMaybe Nothing++just :: a -> Nullable a+just = fromMaybe . Just
+ source/library/Argo/Internal/Type/Optional.hs view
@@ -0,0 +1,17 @@+module Argo.Internal.Type.Optional where++newtype Optional a+ = Optional (Maybe a)+ deriving (Eq, Show)++fromMaybe :: Maybe a -> Optional a+fromMaybe = Optional++toMaybe :: Optional a -> Maybe a+toMaybe (Optional x) = x++nothing :: Optional a+nothing = fromMaybe Nothing++just :: a -> Optional a+just = fromMaybe . Just
+ source/library/Argo/Internal/Type/Permission.hs view
@@ -0,0 +1,19 @@+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveLift #-}++module Argo.Internal.Type.Permission where++import qualified Argo.Vendor.DeepSeq as DeepSeq+import qualified Argo.Vendor.TemplateHaskell as TH+import qualified GHC.Generics as Generics++data Permission+ = Allow+ | Forbid+ deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)++toBool :: Permission -> Bool+toBool x = case x of+ Allow -> True+ Forbid -> False
+ source/library/Argo/Internal/Type/Settings.hs view
@@ -0,0 +1,24 @@+module Argo.Internal.Type.Settings where++import qualified Argo.Internal.Type.Flag as Flag+import qualified Argo.Internal.Type.Indent as Indent+import qualified Text.Read as Read++data Settings = Settings+ { help :: Bool+ , indent :: Indent.Indent+ , version :: Bool+ }+ deriving (Eq, Show)++initial :: Settings+initial = Settings { help = False, indent = Indent.Spaces 0, version = False }++applyFlag :: Settings -> Flag.Flag -> Either String Settings+applyFlag settings flag = case flag of+ Flag.Help -> pure settings { help = True }+ Flag.Spaces string -> do+ int <- Read.readEither string+ pure settings { indent = Indent.Spaces int }+ Flag.Tab -> pure settings { indent = Indent.Tab }+ Flag.Version -> pure settings { version = True }
− source/library/Argo/Json/Array.hs
@@ -1,43 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Array where--import qualified Argo.Literal as Literal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Transformers as Trans-import qualified GHC.Generics as Generics--newtype Array value- = Array [value]- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromList :: [value] -> Array value-fromList = Array--toList :: Array value -> [value]-toList (Array x) = x--encode :: (value -> Encoder.Encoder ()) -> Array value -> Encoder.Encoder ()-encode f =- Encoder.list- (Trans.lift . Trans.tell $ Builder.word8 Literal.leftSquareBracket)- (Trans.lift . Trans.tell $ Builder.word8 Literal.rightSquareBracket- )- (Trans.lift . Trans.tell $ Builder.word8 Literal.comma)- f- . toList--decode :: Decoder.Decoder value -> Decoder.Decoder (Array value)-decode f = do- Decoder.word8 Literal.leftSquareBracket- Decoder.spaces- xs <- Decoder.list f- Decoder.word8 Literal.rightSquareBracket- Decoder.spaces- pure $ fromList xs
− source/library/Argo/Json/Boolean.hs
@@ -1,42 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Boolean where--import Control.Applicative ((<|>))--import qualified Argo.Literal as Literal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Transformers as Trans-import qualified GHC.Generics as Generics--newtype Boolean- = Boolean Bool- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromBool :: Bool -> Boolean-fromBool = Boolean--toBool :: Boolean -> Bool-toBool (Boolean x) = x--encode :: Boolean -> Encoder.Encoder ()-encode x = Trans.lift . Trans.tell . Builder.byteString $ if toBool x- then Literal.true- else Literal.false--decode :: Decoder.Decoder Boolean-decode = decodeFalse <|> decodeTrue--decodeFalse :: Decoder.Decoder Boolean-decodeFalse =- fromBool False <$ Decoder.byteString Literal.false <* Decoder.spaces--decodeTrue :: Decoder.Decoder Boolean-decodeTrue =- fromBool True <$ Decoder.byteString Literal.true <* Decoder.spaces
− source/library/Argo/Json/Member.hs
@@ -1,45 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Member where--import qualified Argo.Json.Name as Name-import qualified Argo.Literal as Literal-import qualified Argo.Type.Config as Config-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified GHC.Generics as Generics--data Member value = Member Name.Name value- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromTuple :: (Name.Name, value) -> Member value-fromTuple = uncurry Member--toTuple :: Member value -> (Name.Name, value)-toTuple (Member k v) = (k, v)--encode :: (value -> Encoder.Encoder ()) -> Member value -> Encoder.Encoder ()-encode f (Member x y) = do- Name.encode x- Trans.lift . Trans.tell $ Builder.word8 Literal.colon- config <- Trans.ask- Monad.when (Config.hasIndent config)- . Trans.lift- . Trans.tell- $ Builder.word8 Literal.space- f y--decode :: Decoder.Decoder value -> Decoder.Decoder (Member value)-decode g =- Member- <$> Name.decode- <* Decoder.word8 Literal.colon- <* Decoder.spaces- <*> g
− source/library/Argo/Json/Name.hs
@@ -1,32 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Name where--import qualified Argo.Json.String as String-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Data.String-import qualified GHC.Generics as Generics--newtype Name- = Name String.String- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Ord, Show)--instance Data.String.IsString Name where- fromString = fromString . Data.String.fromString--fromString :: String.String -> Name-fromString = Name--toString :: Name -> String.String-toString (Name x) = x--encode :: Name -> Encoder.Encoder ()-encode = String.encode . toString--decode :: Decoder.Decoder Name-decode = fromString <$> String.decode
− source/library/Argo/Json/Null.hs
@@ -1,30 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Null where--import qualified Argo.Literal as Literal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Transformers as Trans-import qualified GHC.Generics as Generics--newtype Null- = Null ()- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromUnit :: () -> Null-fromUnit = Null--toUnit :: Null -> ()-toUnit (Null x) = x--encode :: Null -> Encoder.Encoder ()-encode = const . Trans.lift . Trans.tell $ Builder.byteString Literal.null--decode :: Decoder.Decoder Null-decode = fromUnit () <$ Decoder.byteString Literal.null <* Decoder.spaces
− source/library/Argo/Json/Number.hs
@@ -1,92 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Number where--import qualified Argo.Literal as Literal-import qualified Argo.Type.Decimal as Decimal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.ByteString as ByteString-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Applicative as Applicative-import qualified Control.Monad as Monad-import qualified Data.Bool as Bool-import qualified Data.Maybe as Maybe-import qualified Data.Word as Word-import qualified GHC.Generics as Generics--newtype Number- = Number Decimal.Decimal- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromDecimal :: Decimal.Decimal -> Number-fromDecimal = Number--toDecimal :: Number -> Decimal.Decimal-toDecimal (Number x) = x--encode :: Number -> Encoder.Encoder ()-encode x = do- let Decimal.Decimal s e = toDecimal x- Trans.lift . Trans.tell $ Builder.integerDec s- Monad.when (e /= 0)- . Trans.lift- . Trans.tell- $ Builder.word8 Literal.latinSmallLetterE- <> Builder.integerDec e--decode :: Decoder.Decoder Number-decode = do- ni <- fmap Maybe.isJust . Applicative.optional $ Decoder.word8- Literal.hyphenMinus- i <- Decoder.takeWhile1 Decoder.isDigit- Monad.when- (ByteString.length i- > 1- && ByteString.elemIndex Literal.digitZero i- == Just 0- )- . Trans.lift- $ Trans.throwE "leading zero"- f <- fmap (Maybe.fromMaybe ByteString.empty) . Applicative.optional $ do- Decoder.word8 Literal.fullStop- Decoder.takeWhile1 Decoder.isDigit- (ne, e) <-- fmap (Maybe.fromMaybe (False, ByteString.empty))- . Applicative.optional- $ do- Monad.void- . Decoder.satisfy- $ \x ->- (x == Literal.latinSmallLetterE)- || (x == Literal.latinCapitalLetterE)- ne <-- fmap (== Just Literal.hyphenMinus)- . Applicative.optional- . Decoder.satisfy- $ \x -> x == Literal.hyphenMinus || x == Literal.plusSign- e <- Decoder.takeWhile1 Decoder.isDigit- pure (ne, e)- Decoder.spaces- pure . fromDecimal $ Decimal.decimal- (negateIf ni $ (fromDigits i * 10 ^ ByteString.length f) + fromDigits f- )- (negateIf ne (fromDigits e) - intToInteger (ByteString.length f))--negateIf :: Bool -> Integer -> Integer-negateIf = Bool.bool id negate--fromDigits :: ByteString.ByteString -> Integer-fromDigits =- ByteString.foldl' (\a e -> (a * 10) + word8ToInteger (e - 0x30)) 0--intToInteger :: Int -> Integer-intToInteger = fromIntegral--word8ToInteger :: Word.Word8 -> Integer-word8ToInteger = fromIntegral
− source/library/Argo/Json/Object.hs
@@ -1,53 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Object where--import qualified Argo.Json.Member as Member-import qualified Argo.Literal as Literal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified GHC.Generics as Generics--newtype Object value- = Object [Member.Member value]- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromList :: [Member.Member value] -> Object value-fromList = Object--toList :: Object value -> [Member.Member value]-toList (Object x) = x--encode :: (value -> Encoder.Encoder ()) -> Object value -> Encoder.Encoder ()-encode f =- Encoder.list- (Trans.lift . Trans.tell $ Builder.word8 Literal.leftCurlyBracket)- (Trans.lift . Trans.tell $ Builder.word8 Literal.rightCurlyBracket)- (Trans.lift . Trans.tell $ Builder.word8 Literal.comma)- (Member.encode f)- . toList--encodeElement- :: (value -> Encoder.Encoder ())- -> Int- -> Member.Member value- -> Encoder.Encoder ()-encodeElement f i x = do- Monad.when (i > 0) . Trans.lift . Trans.tell $ Builder.word8 Literal.comma- Member.encode f x--decode :: Decoder.Decoder value -> Decoder.Decoder (Object value)-decode f = do- Decoder.word8 Literal.leftCurlyBracket- Decoder.spaces- xs <- Decoder.list $ Member.decode f- Decoder.word8 Literal.rightCurlyBracket- Decoder.spaces- pure $ fromList xs
− source/library/Argo/Json/String.hs
@@ -1,179 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.String where--import qualified Argo.Literal as Literal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.ByteString as ByteString-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Text as Text-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified Data.Char as Char-import qualified Data.String as String-import qualified Data.Word as Word-import qualified GHC.Generics as Generics--newtype String- = String Text.Text- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Ord, Show)--instance String.IsString Argo.Json.String.String where- fromString = fromText . String.fromString--fromText :: Text.Text -> Argo.Json.String.String-fromText = String--toText :: Argo.Json.String.String -> Text.Text-toText (String x) = x--encode :: Argo.Json.String.String -> Encoder.Encoder ()-encode x =- Trans.lift- . Trans.tell- $ Builder.word8 Literal.quotationMark- <> Text.encodeUtf8BuilderEscaped encodeChar (toText x)- <> Builder.word8 Literal.quotationMark--encodeChar :: Builder.BoundedPrim Word.Word8-encodeChar =- Builder.condB- (== Literal.quotationMark)- (encodeShortEscape Literal.quotationMark)- . Builder.condB- (== Literal.reverseSolidus)- (encodeShortEscape Literal.reverseSolidus)- . Builder.condB- (== Literal.backspace)- (encodeShortEscape Literal.latinSmallLetterB)- . Builder.condB- (== Literal.formFeed)- (encodeShortEscape Literal.latinSmallLetterF)- . Builder.condB- (== Literal.newLine)- (encodeShortEscape Literal.latinSmallLetterN)- . Builder.condB- (== Literal.carriageReturn)- (encodeShortEscape Literal.latinSmallLetterR)- . Builder.condB- (== Literal.horizontalTabulation)- (encodeShortEscape Literal.latinSmallLetterT)- . Builder.condB (< Literal.space) encodeLongEscape- $ Builder.liftFixedToBounded Builder.word8F--encodeShortEscape :: Word.Word8 -> Builder.BoundedPrim a-encodeShortEscape x =- Builder.liftFixedToBounded- $ const (Literal.reverseSolidus, x)- Builder.>$< Builder.word8F- Builder.>*< Builder.word8F--encodeLongEscape :: Builder.BoundedPrim Word.Word8-encodeLongEscape =- Builder.liftFixedToBounded- $ (\x ->- ( Literal.reverseSolidus- , (Literal.latinSmallLetterU, word8ToWord16 x)- )- )- Builder.>$< Builder.word8F- Builder.>*< Builder.word8F- Builder.>*< Builder.word16HexFixed--word8ToWord16 :: Word.Word8 -> Word.Word16-word8ToWord16 = fromIntegral--decode :: Decoder.Decoder Argo.Json.String.String-decode = do- Decoder.word8 Literal.quotationMark- b1 <- Trans.get- i <- case getClose b1 0 of- Nothing -> Trans.lift $ Trans.throwE "unterminated string"- Just i -> pure i- let (xs, b2) = ByteString.splitAt i b1- Monad.when (ByteString.any (< Literal.space) xs)- . Trans.lift- $ Trans.throwE "unescaped control character"- Trans.put b2- Decoder.word8 Literal.quotationMark- Decoder.spaces- case Text.decodeUtf8' xs of- Left e -> Trans.lift . Trans.throwE $ show e- Right x -> case unescapeText x of- Left e -> Trans.lift $ Trans.throwE e- Right y -> pure $ fromText y--findAt :: Word.Word8 -> Int -> ByteString.ByteString -> Maybe Int-findAt x i = fmap (+ i) . ByteString.elemIndex x . ByteString.drop i--countConsecutive :: Word.Word8 -> Int -> ByteString.ByteString -> Int-countConsecutive x i =- ByteString.length . ByteString.takeWhileEnd (== x) . ByteString.take i--getClose :: ByteString.ByteString -> Int -> Maybe Int-getClose b i = do- j <- findAt Literal.quotationMark i b- let n = countConsecutive Literal.reverseSolidus j b- if even n then Just j else getClose b $ j + 1--unescapeText :: Text.Text -> Either Prelude.String Text.Text-unescapeText =- fmap (Text.pack . combineSurrogatePairs) . unescapeString . Text.unpack--combineSurrogatePairs :: Prelude.String -> Prelude.String-combineSurrogatePairs xs = case xs of- "" -> xs- x : y : zs | isHighSurrogate x && isLowSurrogate y ->- combineSurrogatePair x y : combineSurrogatePairs zs- x : ys -> x : combineSurrogatePairs ys--combineSurrogatePair :: Char -> Char -> Char-combineSurrogatePair hi lo =- Char.chr- $ 0x10000- + ((Char.ord hi - 0xd800) * 0x400)- + (Char.ord lo - 0xdc00)--isHighSurrogate :: Char -> Bool-isHighSurrogate x = '\xd800' <= x && x <= '\xdbff'--isLowSurrogate :: Char -> Bool-isLowSurrogate x = '\xdc00' <= x && x <= '\xdfff'--unescapeString :: Prelude.String -> Either Prelude.String Prelude.String-unescapeString xs = case xs of- "" -> pure xs- '\\' : ys -> case ys of- "" -> Left "empty escape"- x : zs -> case x of- '"' -> ('"' :) <$> unescapeString zs- '\\' -> ('\\' :) <$> unescapeString zs- '/' -> ('/' :) <$> unescapeString zs- 'b' -> ('\b' :) <$> unescapeString zs- 'f' -> ('\f' :) <$> unescapeString zs- 'n' -> ('\n' :) <$> unescapeString zs- 'r' -> ('\r' :) <$> unescapeString zs- 't' -> ('\t' :) <$> unescapeString zs- 'u' -> case zs of- a : b : c : d : es | Just y <- fromLongEscape a b c d ->- (y :) <$> unescapeString es- _ -> Left "invalid long escape"- _ -> Left "invalid short escape"- x : ys -> (x :) <$> unescapeString ys--fromLongEscape :: Char -> Char -> Char -> Char -> Maybe Char-fromLongEscape a b c d = do- w <- fromHexadecimalDigit a- x <- fromHexadecimalDigit b- y <- fromHexadecimalDigit c- z <- fromHexadecimalDigit d- pure . Char.chr $ (0x1000 * w) + (0x100 * x) + (0x10 * y) + z--fromHexadecimalDigit :: Char -> Maybe Int-fromHexadecimalDigit x =- if Char.isHexDigit x then Just $ Char.digitToInt x else Nothing
− source/library/Argo/Json/Value.hs
@@ -1,52 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Json.Value where--import Control.Applicative ((<|>))--import qualified Argo.Json.Array as Array-import qualified Argo.Json.Boolean as Boolean-import qualified Argo.Json.Null as Null-import qualified Argo.Json.Number as Number-import qualified Argo.Json.Object as Object-import qualified Argo.Json.String as String-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Data.String-import qualified GHC.Generics as Generics---- | A JSON (JavaScript Object Notation) value, as described by RFC 8259.--- <https://datatracker.ietf.org/doc/html/rfc8259>-data Value- = Null Null.Null- | Boolean Boolean.Boolean- | Number Number.Number- | String String.String- | Array (Array.Array Value)- | Object (Object.Object Value)- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--instance Data.String.IsString Value where- fromString = String . Data.String.fromString--encode :: Value -> Encoder.Encoder ()-encode x = case x of- Null y -> Null.encode y- Boolean y -> Boolean.encode y- Number y -> Number.encode y- String y -> String.encode y- Array y -> Array.encode encode y- Object y -> Object.encode encode y--decode :: Decoder.Decoder Value-decode =- (Null <$> Null.decode)- <|> (Boolean <$> Boolean.decode)- <|> (Number <$> Number.decode)- <|> (String <$> String.decode)- <|> (Array <$> Array.decode decode)- <|> (Object <$> Object.decode decode)
− source/library/Argo/Literal.hs
@@ -1,103 +0,0 @@-module Argo.Literal where--import qualified Argo.Vendor.ByteString as ByteString-import qualified Data.Word as Word--backspace :: Word.Word8-backspace = 0x08--carriageReturn :: Word.Word8-carriageReturn = 0x0d--colon :: Word.Word8-colon = 0x3a--comma :: Word.Word8-comma = 0x2c--digitNine :: Word.Word8-digitNine = 0x39--digitOne :: Word.Word8-digitOne = 0x31--digitZero :: Word.Word8-digitZero = 0x30--false :: ByteString.ByteString-false = ByteString.pack [0x66, 0x61, 0x6c, 0x73, 0x65]--formFeed :: Word.Word8-formFeed = 0x0c--fullStop :: Word.Word8-fullStop = 0x2e--horizontalTabulation :: Word.Word8-horizontalTabulation = 0x09--hyphenMinus :: Word.Word8-hyphenMinus = 0x2d--latinCapitalLetterE :: Word.Word8-latinCapitalLetterE = 0x45--latinSmallLetterB :: Word.Word8-latinSmallLetterB = 0x62--latinSmallLetterE :: Word.Word8-latinSmallLetterE = 0x65--latinSmallLetterF :: Word.Word8-latinSmallLetterF = 0x66--latinSmallLetterN :: Word.Word8-latinSmallLetterN = 0x6e--latinSmallLetterR :: Word.Word8-latinSmallLetterR = 0x72--latinSmallLetterT :: Word.Word8-latinSmallLetterT = 0x74--latinSmallLetterU :: Word.Word8-latinSmallLetterU = 0x75--leftCurlyBracket :: Word.Word8-leftCurlyBracket = 0x7b--leftSquareBracket :: Word.Word8-leftSquareBracket = 0x5b--newLine :: Word.Word8-newLine = 0x0a--null :: ByteString.ByteString-null = ByteString.pack [0x6e, 0x75, 0x6c, 0x6c]--plusSign :: Word.Word8-plusSign = 0x2b--quotationMark :: Word.Word8-quotationMark = 0x22--reverseSolidus :: Word.Word8-reverseSolidus = 0x5c--rightCurlyBracket :: Word.Word8-rightCurlyBracket = 0x7d--rightSquareBracket :: Word.Word8-rightSquareBracket = 0x5d--solidus :: Word.Word8-solidus = 0x2f--space :: Word.Word8-space = 0x20--tilde :: Word.Word8-tilde = 0x7e--true :: ByteString.ByteString-true = ByteString.pack [0x74, 0x72, 0x75, 0x65]
− source/library/Argo/Main.hs
@@ -1,86 +0,0 @@-module Argo.Main where--import qualified Argo-import qualified Argo.Type.Flag as Flag-import qualified Argo.Type.Settings as Settings-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.ByteString as ByteString-import qualified Control.Monad as Monad-import qualified Data.Version as Version-import qualified Paths_argo as This-import qualified System.Console.GetOpt as Console-import qualified System.Environment as Environment-import qualified System.Exit as Exit-import qualified System.IO as IO--main :: IO ()-main = do- name <- Environment.getProgName- arguments <- Environment.getArgs- mainWith name arguments--mainWith :: String -> [String] -> IO ()-mainWith name arguments = do- let ((warnings, errors), flags) = getFlags arguments- mapM_ (IO.hPutStrLn IO.stderr) warnings- mapM_ (IO.hPutStr IO.stderr) errors- Monad.unless (null errors) Exit.exitFailure-- withSettings name flags $ \settings -> do- contents <- ByteString.getContents- value <- case Argo.decode contents of- Left e -> fail e- Right x -> pure (x :: Argo.Value)- Builder.hPutBuilder IO.stdout- $ Argo.encodeWith (Settings.indent settings) value--getFlags :: [String] -> (([String], [String]), [Flag.Flag])-getFlags arguments =- let- (flags, xs, ys, errors) =- Console.getOpt' Console.Permute options arguments- warnings =- fmap (mappend "unknown argument " . quote) xs- <> fmap (mappend "unknown option " . quote) ys- in ((warnings, errors), flags)--withSettings :: String -> [Flag.Flag] -> (Settings.Settings -> IO ()) -> IO ()-withSettings name flags callback = do- settings <- either fail pure- $ Monad.foldM Settings.applyFlag Settings.initial flags- if Settings.help settings- then putStr- $ Console.usageInfo (name <> " version " <> version) options- else if Settings.version settings- then putStrLn version- else callback settings--quote :: String -> String-quote x = "`" <> x <> "'"--version :: String-version = Version.showVersion This.version--options :: [Console.OptDescr Flag.Flag]-options =- [ Console.Option- ['h', '?']- ["help"]- (Console.NoArg Flag.Help)- "shows this help message and exits"- , Console.Option- ['v']- ["version"]- (Console.NoArg Flag.Version)- "shows the version number and exits"- , Console.Option- ['s']- ["spaces"]- (Console.ReqArg Flag.Spaces "INT")- "pretty-prints the output using INT sapces"- , Console.Option- ['t']- ["tab"]- (Console.NoArg Flag.Tab)- "pretty-prints the output using tabs"- ]
− source/library/Argo/Pattern.hs
@@ -1,46 +0,0 @@-{-# LANGUAGE PatternSynonyms #-}--module Argo.Pattern where--import qualified Argo.Json.Array as Array-import qualified Argo.Json.Boolean as Boolean-import qualified Argo.Json.Member as Member-import qualified Argo.Json.Name as Name-import qualified Argo.Json.Null as Null-import qualified Argo.Json.Number as Number-import qualified Argo.Json.Object as Object-import qualified Argo.Json.String as String-import qualified Argo.Json.Value as Value-import qualified Argo.Type.Decimal as Decimal-import qualified Argo.Vendor.Text as Text--pattern Null :: Value.Value-pattern Null = Value.Null (Null.Null ())--pattern Boolean :: Bool -> Value.Value-pattern Boolean x = Value.Boolean (Boolean.Boolean x)--pattern Number :: Decimal.Decimal -> Value.Value-pattern Number x = Value.Number (Number.Number x)--pattern String :: Text.Text -> Value.Value-pattern String x = Value.String (String.String x)--pattern Array :: [Value.Value] -> Value.Value-pattern Array x = Value.Array (Array.Array x)--pattern Object :: [Member.Member Value.Value] -> Value.Value-pattern Object x = Value.Object (Object.Object x)--{-# COMPLETE Null, Boolean, Number, String, Array, Object #-}--pattern Name :: Text.Text -> Name.Name-pattern Name x = Name.Name (String.String x)--{-# COMPLETE Name #-}--pattern Decimal :: Integer -> Integer -> Decimal.Decimal-pattern Decimal s e <- Decimal.Decimal s e where- Decimal s e = Decimal.decimal s e--{-# COMPLETE Decimal #-}
− source/library/Argo/Pointer/Pointer.hs
@@ -1,87 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Pointer.Pointer where--import qualified Argo.Json.Array as Array-import qualified Argo.Json.Member as Member-import qualified Argo.Json.Name as Name-import qualified Argo.Json.Object as Object-import qualified Argo.Json.String as String-import qualified Argo.Json.Value as Value-import qualified Argo.Literal as Literal-import qualified Argo.Pointer.Token as Token-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Text as Text-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Applicative as Applicative-import qualified Data.List as List-import qualified GHC.Generics as Generics-import qualified Text.Read as Read---- | A JSON pointer, as described by RFC 6901.--- <https://datatracker.ietf.org/doc/html/rfc6901>-newtype Pointer- = Pointer [Token.Token]- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--fromList :: [Token.Token] -> Pointer-fromList = Pointer--toList :: Pointer -> [Token.Token]-toList (Pointer x) = x--decode :: Decoder.Decoder Pointer-decode = fromList <$> Applicative.many decodeToken--decodeToken :: Decoder.Decoder Token.Token-decodeToken = do- Decoder.word8 Literal.solidus- Token.decode--encode :: Pointer -> Encoder.Encoder ()-encode = mapM_ encodeToken . toList--encodeToken :: Token.Token -> Encoder.Encoder ()-encodeToken x = do- Trans.lift . Trans.tell $ Builder.word8 Literal.solidus- Token.encode x--evaluate :: Pointer -> Value.Value -> Either String Value.Value-evaluate p v = case toList p of- [] -> pure v- t : ts -> do- w <- case v of- Value.Array a -> atIndex t a- Value.Object o -> atKey t o- _ -> Left "not indexable"- evaluate (fromList ts) w--atIndex :: Token.Token -> Array.Array value -> Either String value-atIndex t a = do- i <- tokenToIndex t- case drop i $ Array.toList a of- [] -> Left $ "missing index: " <> show t- e : _ -> pure e--tokenToIndex :: Token.Token -> Either String Int-tokenToIndex token = do- let text = Token.toText token- invalid = "invalid index: " <> show token- case Text.uncons text of- Just ('0', rest) -> if Text.null rest then pure 0 else Left invalid- _ -> maybe (Left invalid) pure . Read.readMaybe $ Text.unpack text--atKey :: Token.Token -> Object.Object value -> Either String value-atKey t =- maybe (Left $ "missing key: " <> show t) (\(Member.Member _ v) -> pure v)- . List.find- (\(Member.Member k _) ->- String.toText (Name.toString k) == Token.toText t- )- . Object.toList
− source/library/Argo/Pointer/Token.hs
@@ -1,72 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Pointer.Token where--import qualified Argo.Literal as Literal-import qualified Argo.Type.Decoder as Decoder-import qualified Argo.Type.Encoder as Encoder-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.ByteString as ByteString-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Text as Text-import qualified Argo.Vendor.Transformers as Trans-import qualified Data.String as String-import qualified Data.Word as Word-import qualified GHC.Generics as Generics--newtype Token- = Token Text.Text- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--instance String.IsString Token where- fromString = fromText . String.fromString--fromText :: Text.Text -> Token-fromText = Token--toText :: Token -> Text.Text-toText (Token x) = x--decode :: Decoder.Decoder Token-decode = do- x <- Decoder.takeWhile $ (/=) Literal.solidus- y <- either (Trans.lift . Trans.throwE) pure $ unescape x- case Text.decodeUtf8' y of- Left e -> Trans.lift . Trans.throwE $ show e- Right z -> pure $ fromText z--unescape :: ByteString.ByteString -> Either String ByteString.ByteString-unescape = fmap ByteString.pack . unescapeHelper . ByteString.unpack--unescapeHelper :: [Word.Word8] -> Either String [Word.Word8]-unescapeHelper xs = case xs of- [] -> pure xs- x : ys -> if x == Literal.tilde- then case ys of- y : zs- | y == Literal.digitZero- -> (:) Literal.tilde <$> unescapeHelper zs- | y == Literal.digitOne- -> (:) Literal.solidus <$> unescapeHelper zs- _ -> Left "invalid escape"- else (:) x <$> unescapeHelper ys--encode :: Token -> Encoder.Encoder ()-encode =- Trans.lift . Trans.tell . Text.encodeUtf8BuilderEscaped encodeChar . toText--encodeChar :: Builder.BoundedPrim Word.Word8-encodeChar =- Builder.condB (== Literal.tilde) (encodeEscape Literal.digitZero)- . Builder.condB (== Literal.solidus) (encodeEscape Literal.digitOne)- $ Builder.liftFixedToBounded Builder.word8F--encodeEscape :: Word.Word8 -> Builder.BoundedPrim a-encodeEscape x =- Builder.liftFixedToBounded- $ const (Literal.tilde, x)- Builder.>$< Builder.word8F- Builder.>*< Builder.word8F
− source/library/Argo/QuasiQuoter.hs
@@ -1,35 +0,0 @@-module Argo.QuasiQuoter where--import qualified Argo.Decode as Decode-import qualified Argo.Json.Value as Value-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Text as Text--pointer :: TH.QuasiQuoter-pointer = defaultQuasiQuoter- { TH.quoteExp =- either fail TH.lift- . Decode.decodePointer- . Text.encodeUtf8- . Text.pack- }--value :: TH.QuasiQuoter-value = defaultQuasiQuoter- { TH.quoteExp =- either fail (TH.lift . asValue)- . Decode.decode- . Text.encodeUtf8- . Text.pack- }--asValue :: Value.Value -> Value.Value-asValue = id--defaultQuasiQuoter :: TH.QuasiQuoter-defaultQuasiQuoter = TH.QuasiQuoter- { TH.quoteDec = const $ fail "cannot be used as a declaration"- , TH.quoteExp = const $ fail "cannot be used as an expression"- , TH.quotePat = const $ fail "cannot be used as a pattern"- , TH.quoteType = const $ fail "cannot be used as a type"- }
− source/library/Argo/Schema/Identifier.hs
@@ -1,27 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Schema.Identifier where--import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Text as Text-import qualified Data.String as String-import qualified GHC.Generics as Generics--newtype Identifier- = Identifier Text.Text- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Ord, Show)--instance String.IsString Identifier where- fromString = fromText . String.fromString--instance Semigroup Identifier where- x <> y = fromText $ toText x <> toText y--fromText :: Text.Text -> Identifier-fromText = Identifier--toText :: Identifier -> Text.Text-toText (Identifier x) = x
− source/library/Argo/Schema/Schema.hs
@@ -1,68 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Schema.Schema where--import qualified Argo.Json.Member as Member-import qualified Argo.Json.Name as Name-import qualified Argo.Json.String as String-import qualified Argo.Json.Value as Value-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Argo.Vendor.Text as Text-import qualified Data.List.NonEmpty as NonEmpty-import qualified GHC.Generics as Generics-import qualified Numeric.Natural as Natural---- | A JSON Schema.--- <https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01>-data Schema- = Array- (Maybe Natural.Natural)- (Maybe Natural.Natural)- (Either Schema (NonEmpty.NonEmpty Schema))- (Maybe Schema)- | Boolean- | Const Value.Value- | False- | Integer (Maybe Integer) (Maybe Integer)- | Null- | Number- | Object [(Name.Name, Schema)] [Name.Name] (Maybe Schema)- | OneOf [Schema]- | Ref Identifier.Identifier- | String (Maybe Natural.Natural) (Maybe Natural.Natural)- | True- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--instance Semigroup Schema where- x <> y = case (x, y) of- (OneOf xs, OneOf ys) -> OneOf $ xs <> ys- (OneOf xs, _) -> OneOf $ y : xs- (_, OneOf ys) -> OneOf $ x : ys- (_, _) -> OneOf [x, y]--instance Monoid Schema where- mempty = Argo.Schema.Schema.True--member :: String -> a -> Member.Member a-member k v =- Member.fromTuple (Name.fromString . String.fromText $ Text.pack k, v)--maybeRef :: (Maybe Identifier.Identifier, Schema) -> Schema-maybeRef (m, s) = maybe s Ref m--false :: Schema-false = Argo.Schema.Schema.False--true :: Schema-true = Argo.Schema.Schema.True--unidentified :: Schema -> (Maybe Identifier.Identifier, Schema)-unidentified s = (Nothing, s)--withIdentifier- :: Identifier.Identifier -> Schema -> (Maybe Identifier.Identifier, Schema)-withIdentifier i s = (Just i, s)
− source/library/Argo/Type/Config.hs
@@ -1,20 +0,0 @@-module Argo.Type.Config where--import qualified Argo.Type.Indent as Indent--data Config = Config- { indent :: Indent.Indent- , level :: Int- }- deriving (Eq, Show)--initial :: Config-initial = Config { indent = Indent.Spaces 0, level = 0 }--hasIndent :: Config -> Bool-hasIndent x = case indent x of- Indent.Spaces y -> y > 0- Indent.Tab -> True--increaseLevel :: Config -> Config-increaseLevel x = x { level = level x + 1 }
− source/library/Argo/Type/Decimal.hs
@@ -1,77 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Type.Decimal where--import Data.Ratio ((%))--import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified Data.List as List-import qualified Data.Ratio as Ratio-import qualified GHC.Generics as Generics-import qualified Numeric--data Decimal = Decimal Integer Integer- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--negate :: Decimal -> Decimal-negate (Decimal s e) = Decimal (-s) e--decimal :: Integer -> Integer -> Decimal-decimal s = normalize . Decimal s--normalize :: Decimal -> Decimal-normalize (Decimal s e) = if s == 0- then Decimal 0 0- else- let (q, r) = quotRem s 10- in if r == 0 then normalize $ Decimal q (e + 1) else Decimal s e--fromInteger :: Integer -> Decimal-fromInteger = flip decimal 0--toInteger :: Decimal -> Maybe Integer-toInteger (Decimal s e) = if e < 0 then Nothing else Just $ s * 10 ^ e--fromRealFloat :: RealFloat a => a -> Maybe Decimal-fromRealFloat x = if isNaN x || isInfinite x- then Nothing- else- Just- . (if x < 0 then Argo.Type.Decimal.negate else id)- . uncurry fromDigits- . Numeric.floatToDigits 10- $ abs x--toRealFloat :: RealFloat a => Decimal -> a-toRealFloat = Prelude.fromRational . Argo.Type.Decimal.toRational--fromDigits :: [Int] -> Int -> Decimal-fromDigits ds e = uncurry decimal $ List.foldl'- (\(a, n) d -> (a * 10 + Prelude.toInteger d, n - 1))- (0, Prelude.toInteger e)- ds--toRational :: Decimal -> Rational-toRational d@(Decimal s e) =- maybe (s % (10 ^ (-e))) fromIntegral $ Argo.Type.Decimal.toInteger d--fromRational :: Rational -> Maybe Decimal-fromRational r =- let- n = Ratio.numerator r- d1 = Ratio.denominator r- (t, d2) = factor 2 (0 :: Integer) d1- (f, d3) = factor 5 (0 :: Integer) d2- p = max t f- in if d3 == 1- then Just $ decimal (n * 2 ^ (p - t) * 5 ^ (p - f)) (-p)- else Nothing---- factor d 0 x = (p, y) <=> x = (d ^ p) * y-factor :: (Num a, Integral b) => b -> a -> b -> (a, b)-factor d n x =- let (q, r) = quotRem x d- in if x /= 0 && r == 0 then factor d (n + 1) q else (n, x)
− source/library/Argo/Type/Decoder.hs
@@ -1,92 +0,0 @@-module Argo.Type.Decoder where--import qualified Argo.Literal as Literal-import qualified Argo.Vendor.ByteString as ByteString-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Applicative as Applicative-import qualified Control.Monad as Monad-import qualified Data.Functor.Identity as Identity-import qualified Data.Word as Word--type Decoder- = Trans.StateT- ByteString.ByteString- (Trans.ExceptT String Identity.Identity)--unwrap- :: Decoder a- -> ByteString.ByteString- -> Either String (a, ByteString.ByteString)-unwrap d = Identity.runIdentity . Trans.runExceptT . Trans.runStateT d--run :: Decoder a -> ByteString.ByteString -> Either String a-run d = fmap fst . unwrap (d <* eof)--list :: Decoder a -> Decoder [a]-list f = listWith f []--listWith :: Decoder a -> [a] -> Decoder [a]-listWith f xs = do- m <- Applicative.optional $ do- Monad.unless (null xs) $ do- word8 Literal.comma- spaces- f- case m of- Nothing -> pure $ reverse xs- Just x -> listWith f $ x : xs--byteString :: ByteString.ByteString -> Decoder ()-byteString x = do- b1 <- Trans.get- case ByteString.stripPrefix x b1 of- Nothing -> Trans.lift . Trans.throwE $ "byteString: " <> show x- Just b2 -> Trans.put b2--dropWhile :: (Word.Word8 -> Bool) -> Decoder ()-dropWhile f = do- b <- Trans.get- Trans.put $ ByteString.dropWhile f b--eof :: Decoder ()-eof = do- b <- Trans.get- Monad.unless (ByteString.null b) . Trans.lift $ Trans.throwE "eof"--isDigit :: Word.Word8 -> Bool-isDigit x = Literal.digitZero <= x && x <= Literal.digitNine--isSpace :: Word.Word8 -> Bool-isSpace x =- (x == Literal.space)- || (x == Literal.horizontalTabulation)- || (x == Literal.newLine)- || (x == Literal.carriageReturn)--satisfy :: (Word.Word8 -> Bool) -> Decoder Word.Word8-satisfy f = do- b1 <- Trans.get- case ByteString.uncons b1 of- Just (x, b2) | f x -> do- Trans.put b2- pure x- _ -> Trans.lift $ Trans.throwE "satisfy"--spaces :: Decoder ()-spaces = Argo.Type.Decoder.dropWhile isSpace--takeWhile :: (Word.Word8 -> Bool) -> Decoder ByteString.ByteString-takeWhile f = do- b1 <- Trans.get- let (x, b2) = ByteString.span f b1- Trans.put b2- pure x--takeWhile1 :: (Word.Word8 -> Bool) -> Decoder ByteString.ByteString-takeWhile1 f = do- x <- Argo.Type.Decoder.takeWhile f- Monad.when (ByteString.null x) . Trans.lift $ Trans.throwE "takeWhile1"- pure x--word8 :: Word.Word8 -> Decoder ()-word8 = Monad.void . satisfy . (==)
− source/library/Argo/Type/Encoder.hs
@@ -1,61 +0,0 @@-module Argo.Type.Encoder where--import qualified Argo.Literal as Literal-import qualified Argo.Type.Config as Config-import qualified Argo.Type.Indent as Indent-import qualified Argo.Vendor.Builder as Builder-import qualified Argo.Vendor.Transformers as Trans-import qualified Control.Monad as Monad-import qualified Data.Functor.Identity as Identity-import qualified Data.Semigroup as Semigroup--type Encoder- = Trans.ReaderT- Config.Config- (Trans.WriterT Builder.Builder Identity.Identity)--unwrap :: Config.Config -> Encoder a -> (a, Builder.Builder)-unwrap c = Identity.runIdentity . Trans.runWriterT . flip Trans.runReaderT c--run :: Config.Config -> Encoder a -> Builder.Builder-run c = snd . unwrap c--list- :: Encoder ()- -> Encoder ()- -> Encoder ()- -> (a -> Encoder ())- -> [a]- -> Encoder ()-list left right separator encode xs = do- left- case xs of- [] -> pure ()- x : ys -> do- Trans.local Config.increaseLevel $ do- maybeIndent <- makeIndent <$> Trans.ask- withNewLine maybeIndent- encode x- Monad.forM_ ys $ \y -> do- separator- withNewLine maybeIndent- encode y- maybeIndent <- makeIndent <$> Trans.ask- withNewLine maybeIndent- right--makeIndent :: Config.Config -> Maybe Builder.Builder-makeIndent config = case Config.indent config of- Indent.Spaces spaces -> if spaces <= 0- then Nothing- else- Just- . Semigroup.stimesMonoid (Config.level config * spaces)- $ Builder.word8 Literal.space- Indent.Tab ->- Just . Semigroup.stimesMonoid (Config.level config) $ Builder.word8- Literal.horizontalTabulation--withNewLine :: Maybe Builder.Builder -> Encoder ()-withNewLine = maybe (pure ()) $ Trans.lift . Trans.tell . mappend- (Builder.word8 Literal.newLine)
− source/library/Argo/Type/Flag.hs
@@ -1,8 +0,0 @@-module Argo.Type.Flag where--data Flag- = Help- | Spaces String- | Tab- | Version- deriving (Eq, Show)
− source/library/Argo/Type/Indent.hs
@@ -1,6 +0,0 @@-module Argo.Type.Indent where--data Indent- = Spaces Int- | Tab- deriving (Eq, Show)
− source/library/Argo/Type/Nullable.hs
@@ -1,17 +0,0 @@-module Argo.Type.Nullable where--newtype Nullable a- = Nullable (Maybe a)- deriving (Eq, Show)--fromMaybe :: Maybe a -> Nullable a-fromMaybe = Nullable--toMaybe :: Nullable a -> Maybe a-toMaybe (Nullable x) = x--nothing :: Nullable a-nothing = fromMaybe Nothing--just :: a -> Nullable a-just = fromMaybe . Just
− source/library/Argo/Type/Optional.hs
@@ -1,17 +0,0 @@-module Argo.Type.Optional where--newtype Optional a- = Optional (Maybe a)- deriving (Eq, Show)--fromMaybe :: Maybe a -> Optional a-fromMaybe = Optional--toMaybe :: Optional a -> Maybe a-toMaybe (Optional x) = x--nothing :: Optional a-nothing = fromMaybe Nothing--just :: a -> Optional a-just = fromMaybe . Just
− source/library/Argo/Type/Permission.hs
@@ -1,19 +0,0 @@-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DeriveLift #-}--module Argo.Type.Permission where--import qualified Argo.Vendor.DeepSeq as DeepSeq-import qualified Argo.Vendor.TemplateHaskell as TH-import qualified GHC.Generics as Generics--data Permission- = Allow- | Forbid- deriving (Eq, Generics.Generic, TH.Lift, DeepSeq.NFData, Show)--toBool :: Permission -> Bool-toBool x = case x of- Allow -> True- Forbid -> False
− source/library/Argo/Type/Settings.hs
@@ -1,24 +0,0 @@-module Argo.Type.Settings where--import qualified Argo.Type.Flag as Flag-import qualified Argo.Type.Indent as Indent-import qualified Text.Read as Read--data Settings = Settings- { help :: Bool- , indent :: Indent.Indent- , version :: Bool- }- deriving (Eq, Show)--initial :: Settings-initial = Settings { help = False, indent = Indent.Spaces 0, version = False }--applyFlag :: Settings -> Flag.Flag -> Either String Settings-applyFlag settings flag = case flag of- Flag.Help -> pure settings { help = True }- Flag.Spaces string -> do- int <- Read.readEither string- pure settings { indent = Indent.Spaces int }- Flag.Tab -> pure settings { indent = Indent.Tab }- Flag.Version -> pure settings { version = True }
source/test-suite/Main.hs view
@@ -7,23 +7,23 @@ import Test.Tasty.QuickCheck ((===)) import qualified Argo-import qualified Argo.Class.HasCodec as HasCodec-import qualified Argo.Codec.Codec as Codec-import qualified Argo.Codec.Object as Codec-import qualified Argo.Codec.Value as Codec-import qualified Argo.Json.Array as Array-import qualified Argo.Json.Boolean as Boolean-import qualified Argo.Json.Name as Name-import qualified Argo.Json.Null as Null-import qualified Argo.Json.Number as Number-import qualified Argo.Json.Object as Object-import qualified Argo.Json.String as String-import qualified Argo.Schema.Identifier as Identifier-import qualified Argo.Schema.Schema as Schema-import qualified Argo.Type.Decimal as Decimal-import qualified Argo.Type.Nullable as Nullable-import qualified Argo.Type.Optional as Optional-import qualified Argo.Type.Permission as Permission+import qualified Argo.Internal.Class.HasCodec as HasCodec+import qualified Argo.Internal.Codec.Codec as Codec+import qualified Argo.Internal.Codec.Object as Codec+import qualified Argo.Internal.Codec.Value as Codec+import qualified Argo.Internal.Json.Array as Array+import qualified Argo.Internal.Json.Boolean as Boolean+import qualified Argo.Internal.Json.Name as Name+import qualified Argo.Internal.Json.Null as Null+import qualified Argo.Internal.Json.Number as Number+import qualified Argo.Internal.Json.Object as Object+import qualified Argo.Internal.Json.String as String+import qualified Argo.Internal.Schema.Identifier as Identifier+import qualified Argo.Internal.Schema.Schema as Schema+import qualified Argo.Internal.Type.Decimal as Decimal+import qualified Argo.Internal.Type.Nullable as Nullable+import qualified Argo.Internal.Type.Optional as Optional+import qualified Argo.Internal.Type.Permission as Permission import qualified Control.Monad.Trans.Accum as Accum import qualified Data.ByteString as ByteString import qualified Data.ByteString.Builder as Builder