jordan-0.1.0.0: JSON with Structure
Safe HaskellSafe-Inferred
LanguageHaskell2010

Jordan.ToJSON.Class

Synopsis

Documentation

class Contravariant f => Selectable f where Source #

Basically just Decidable but without a superclass constraint that we cannot implement for JSON.

More specifically, we can quite easily serialize some object into either a string or a number as a top-level JSON value, but we cannot serialize both a string and a number as a top level key. This means that we cannot implement Divisible, but we can implement all the operations from Decidable.

This class lets us decide without being able to divide, which is fun to say.

Methods

giveUp :: (arg -> Void) -> f arg Source #

Give up trying to decide.

select :: (arg -> Either lhs rhs) -> f lhs -> f rhs -> f arg Source #

Pick one thing, or another, as long as you can serialize both options.

Instances

Instances details
Selectable JSONBuilder Source # 
Instance details

Defined in Jordan.ToJSON.Builder

Methods

giveUp :: (arg -> Void) -> JSONBuilder arg Source #

select :: (arg -> Either lhs rhs) -> JSONBuilder lhs -> JSONBuilder rhs -> JSONBuilder arg Source #

Selectable JSONText Source # 
Instance details

Defined in Jordan.ToJSON.Text

Methods

giveUp :: (arg -> Void) -> JSONText arg Source #

select :: (arg -> Either lhs rhs) -> JSONText lhs -> JSONText rhs -> JSONText arg Source #

class Divisible f => JSONObjectSerializer f where Source #

An abstract representation of how to serialize a JSON object. Since serializing is the exact opposite of parsing, we have to be Decidable instead of Alternative.

That is, if we are serializing a JSON object, we need to be able to break things apart.

Unfortunately the combinators for breaking things apart are more annoying to use than the combinators for putting things together, and involve a lot of tuples everywhere.

Thankfully we provide a good interface to derive these classes generically!

Methods

writeField Source #

Arguments

:: Text

Label for the field to write

-> (forall jsonSerializer. JSONSerializer jsonSerializer => jsonSerializer a)

How to write the field. The forall ensures that JSON serialization is kept completely abstract. You can only use the methods of JSONSerializer here.

-> f a 

Instances

Instances details
JSONObjectSerializer CommaBuilder Source # 
Instance details

Defined in Jordan.ToJSON.Text

Methods

writeField :: Text -> (forall (jsonSerializer :: Type -> Type). JSONSerializer jsonSerializer => jsonSerializer a) -> CommaBuilder a Source #

class Divisible f => JSONTupleSerializer f where Source #

Methods

writeItem Source #

Arguments

:: (forall jsonSerializer. JSONSerializer jsonSerializer => jsonSerializer a)

Write a single item into the tuple. The forall keeps things abstract.

-> f a 

Instances

Instances details
JSONTupleSerializer TextArray Source # 
Instance details

Defined in Jordan.ToJSON.Text

Methods

writeItem :: (forall (jsonSerializer :: Type -> Type). JSONSerializer jsonSerializer => jsonSerializer a) -> TextArray a Source #

JSONTupleSerializer CommaBuilder Source # 
Instance details

Defined in Jordan.ToJSON.Text

Methods

writeItem :: (forall (jsonSerializer :: Type -> Type). JSONSerializer jsonSerializer => jsonSerializer a) -> CommaBuilder a Source #

class Selectable f => JSONSerializer f where Source #

An abstract representation of how to serialize a Haskell value into JSON.

Methods

serializeObject Source #

Arguments

:: Text

A name for the object. Should be "globally unique" as much as possible.

-> (forall objSerializer. JSONObjectSerializer objSerializer => objSerializer a)

How to serialize the object. The forall here keeps things abstract: you are only allowed to use the methods of JSONObjectSerializer here.

-> f a 

serializeDictionary :: Foldable t => (forall jsonSerializer. JSONSerializer jsonSerializer => jsonSerializer a) -> f (t (Text, a)) Source #

serializeText :: f Text Source #

serializeTextConstant :: Text -> f a Source #

Serialize some text constant. Note that this returns a serializer of anything: if you are always going to serialize out the same string, we don't need to even look at the thing we're serializing!

serializeNull :: f any Source #

serializeNumber :: f Scientific Source #

serializeBool :: f Bool Source #

serializeTuple :: (forall tupleSerializer. JSONTupleSerializer tupleSerializer => tupleSerializer a) -> f a Source #

serializeArray :: ToJSON a => f [a] Source #

Instances

Instances details
JSONSerializer JSONBuilder Source # 
Instance details

Defined in Jordan.ToJSON.Builder

Methods

serializeObject :: Text -> (forall (objSerializer :: Type -> Type). JSONObjectSerializer objSerializer => objSerializer a) -> JSONBuilder a Source #

serializeDictionary :: Foldable t => (forall (jsonSerializer :: Type -> Type). JSONSerializer jsonSerializer => jsonSerializer a) -> JSONBuilder (t (Text, a)) Source #

serializeText :: JSONBuilder Text Source #

serializeTextConstant :: Text -> JSONBuilder a Source #

serializeNull :: JSONBuilder any Source #

serializeNumber :: JSONBuilder Scientific Source #

serializeBool :: JSONBuilder Bool Source #

serializeTuple :: (forall (tupleSerializer :: Type -> Type). JSONTupleSerializer tupleSerializer => tupleSerializer a) -> JSONBuilder a Source #

serializeArray :: ToJSON a => JSONBuilder [a] Source #

JSONSerializer JSONText Source # 
Instance details

Defined in Jordan.ToJSON.Text

Methods

serializeObject :: Text -> (forall (objSerializer :: Type -> Type). JSONObjectSerializer objSerializer => objSerializer a) -> JSONText a Source #

serializeDictionary :: Foldable t => (forall (jsonSerializer :: Type -> Type). JSONSerializer jsonSerializer => jsonSerializer a) -> JSONText (t (Text, a)) Source #

serializeText :: JSONText Text Source #

serializeTextConstant :: Text -> JSONText a Source #

serializeNull :: JSONText any Source #

serializeNumber :: JSONText Scientific Source #

serializeBool :: JSONText Bool Source #

serializeTuple :: (forall (tupleSerializer :: Type -> Type). JSONTupleSerializer tupleSerializer => tupleSerializer a) -> JSONText a Source #

serializeArray :: ToJSON a => JSONText [a] Source #

class ToJSON v where Source #

A class to provide the canonical way to encode a JSON.

This class uses finally tagless style to keep the instructions for serializing abstract. This allows us to automatically generate documentation, and to generate serializers that always avoid the need for intermediate structures.

This class is derivable generically, and will generate a "nice" format. In my opinion, at least.

Minimal complete definition

Nothing

Methods

toJSON :: JSONSerializer f => f v Source #

default toJSON :: (Generic v, GToJSON (Rep v)) => JSONSerializer f => f v Source #

Instances

Instances details
ToJSON Bool Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f Bool Source #

ToJSON Double Source # 
Instance details

Defined in Jordan.ToJSON.Class

ToJSON Float Source # 
Instance details

Defined in Jordan.ToJSON.Class

ToJSON Int Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f Int Source #

ToJSON Integer Source # 
Instance details

Defined in Jordan.ToJSON.Class

ToJSON () Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f () Source #

ToJSON Text Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f Text Source #

ToJSON String Source # 
Instance details

Defined in Jordan.ToJSON.Class

ToJSON All Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f All Source #

ToJSON Any Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f Any Source #

ToJSON Scientific Source # 
Instance details

Defined in Jordan.ToJSON.Class

ToJSON a => ToJSON [a] Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f [a] Source #

ToJSON a => ToJSON (Maybe a) Source #

Nothings get serialized as null.

Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Maybe a) Source #

(ToJSON a, Typeable a) => ToJSON (Ratio a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Ratio a) Source #

ToJSON a => ToJSON (Min a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Min a) Source #

ToJSON a => ToJSON (Max a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Max a) Source #

ToJSON a => ToJSON (First a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (First a) Source #

ToJSON a => ToJSON (Last a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Last a) Source #

ToJSON a => ToJSON (Dual a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Dual a) Source #

ToJSON a => ToJSON (Sum a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Sum a) Source #

ToJSON a => ToJSON (Product a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Product a) Source #

(ToJSON lhs, ToJSON rhs) => ToJSON (Either lhs rhs) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Either lhs rhs) Source #

ToJSON a => ToJSON (Map Text a) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

toJSON :: JSONSerializer f => f (Map Text a) Source #

class GToJSON v where Source #

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (v a) Source #

Instances

Instances details
GToJSON (V1 :: Type -> Type) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (V1 a) Source #

(GToJSON (PartOfSum l), GToJSON (PartOfSum r)) => GToJSON (PartOfSum (l :+: r)) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (PartOfSum (l :+: r) a) Source #

(Constructor t, GToJSON (C1 t f)) => GToJSON (PartOfSum (C1 t f)) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (PartOfSum (C1 t f) a) Source #

Constructor t => GToJSON (PartOfSum (C1 t (U1 :: Type -> Type))) Source # 
Instance details

Defined in Jordan.ToJSON.Class

ToJSON c => GToJSON (K1 i c :: Type -> Type) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (K1 i c a) Source #

(GToJSON (PartOfSum l), GToJSON (PartOfSum r)) => GToJSON (l :+: r) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s ((l :+: r) a) Source #

(GToJSON f, Datatype t) => GToJSON (D1 t f) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (D1 t f a) Source #

ToJSON i => GToJSON (C1 c (S1 ('MetaSel ('Nothing :: Maybe Symbol) su ss ds) (Rec0 i))) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (C1 c (S1 ('MetaSel 'Nothing su ss ds) (Rec0 i)) a) Source #

(GToJSONObject inner, Constructor t) => GToJSON (C1 t inner) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s => ToJSONOptions -> s (C1 t inner a) Source #

GToJSON s => GToJSON (S1 whatever s) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSON :: JSONSerializer s0 => ToJSONOptions -> s0 (S1 whatever s a) Source #

sumToEither :: (l :+: r) a -> Either (l a) (r a) Source #

class GToJSONObject v where Source #

Instances

Instances details
(GToJSONObject lhs, GToJSONObject rhs) => GToJSONObject (lhs :*: rhs) Source # 
Instance details

Defined in Jordan.ToJSON.Class

Methods

gToJSONObject :: JSONObjectSerializer f => ToJSONOptions -> f ((lhs :*: rhs) a) Source #

(GToJSON f, Selector t) => GToJSONObject (S1 t f) Source # 
Instance details

Defined in Jordan.ToJSON.Class