Safe Haskell  None 

Language  Haskell2010 
 data Serializer a b = Serializer {
 serialize :: a > b
 deserialize :: b > Maybe a
 deserializeEither :: b > Either String a
 simpleSerializer :: (a > b) > (b > Maybe a) > Serializer a b
 composeSerializers :: Serializer a b > Serializer b c > Serializer a c
 idSerializer :: Serializer a a
 traverseSerializer :: Traversable t => Serializer a b > Serializer (t a) (t b)
 jsonSerializer :: (ToJSON a, FromJSON a) => Serializer a Value
 jsonTextSerializer :: (ToJSON a, FromJSON a) => Serializer a Text
 dynamicSerializer :: Typeable a => Serializer a Dynamic
 class EventSumType a where
 eventSumTypeSerializer :: (Typeable a, EventSumType a, EventSumType b) => Serializer a b
Class
data Serializer a b Source #
A Serializer
describes the injective conversion between types a
and
b
. In plain English, this means that you can go from a
to b
, and you
can Maybe
go from b
back to a
. This is often used to serialize events
to an event store, and then deserialize them back.
Serializer  

simpleSerializer :: (a > b) > (b > Maybe a) > Serializer a b Source #
Simple constructor to just use deserialize
to construct
deserializeEither
.
composeSerializers :: Serializer a b > Serializer b c > Serializer a c Source #
Apply an intermediate Serializer
to a serializer to go from type a
to
c
with b
in the middle. Note that with deserializing, if the conversion
from c
to b
or from b
to a
fails, the whole deserialization fails.
Common serializers
idSerializer :: Serializer a a Source #
Simple "serializer" using id
. Useful for when an API requires a
serializer but you don't need to actually change types.
traverseSerializer :: Traversable t => Serializer a b > Serializer (t a) (t b) Source #
Uses Traversable
to wrap a Serializer
.
jsonSerializer :: (ToJSON a, FromJSON a) => Serializer a Value Source #
A Serializer
for aeson Value
s.
jsonTextSerializer :: (ToJSON a, FromJSON a) => Serializer a Text Source #
A Serializer
to convert JSON to/from lazy text. Useful for Sql event
stores that store JSON values as text.
dynamicSerializer :: Typeable a => Serializer a Dynamic Source #
A Serializer
for Dynamic
values using toDyn
and fromDynamic
.
Sum types
class EventSumType a where Source #
This is a type class for serializing sum types of events to Dynamic
without the associated constructor. This is useful when transforming between
two sum types of events. A common pattern is to put all the events in an
application in one big event sum type, and then have a smaller sum type for
each Projection
. Then, you can use eventSumTypeSerializer
to transform
between the two.
It is meant to be derived with Generic
. For example:
data EventA = EventA deriving (Show) data EventB = EventB deriving (Show) data EventC = EventC deriving (Show) data AllEvents = AllEventsEventA EventA  AllEventsEventB EventB  AllEventsEventC EventC deriving (Show, Generic) instance EventSumType AllEvents data MyEvents = MyEventsEventA EventA  MyEventsEventB EventB deriving (Show, Generic) instance EventSumType MyEvents
Now we can serialize to Dynamic
without a constructor tag:
>>>
eventToDyn (MyEventsEventA EventA)
<<EventA>>
We can also go from a MyEvents
value to an AllEvents
value:
>>>
eventFromDyn (eventToDyn (MyEventsEventA EventA)) :: Maybe AllEvents
Just (AllEventsEventA EventA)
eventToDyn :: a > Dynamic Source #
Convert an event to a Dynamic
without the constructor tag
eventFromDyn :: Dynamic > Maybe a Source #
Go from a Dynamic
to an event with the constructor tag. Note, this
function is O(n)
to the number of constructors.
eventToDyn :: (Generic a, EventSumType' (Rep a)) => a > Dynamic Source #
Convert an event to a Dynamic
without the constructor tag
eventFromDyn :: (Generic a, EventSumType' (Rep a)) => Dynamic > Maybe a Source #
Go from a Dynamic
to an event with the constructor tag. Note, this
function is O(n)
to the number of constructors.
eventSumTypeSerializer :: (Typeable a, EventSumType a, EventSumType b) => Serializer a b Source #
A Serializer
from one EventSumType
instance to another. WARNING: If
not all events in the source EventSumType
are in the serialized
EventSumType
, then this function will be partial!