Safe Haskell | None |
---|---|
Language | Haskell98 |
Haskell-side view of CRDT
- data DataType
- newtype Counter = Counter Count
- type Count = Int64
- data CounterOp = CounterInc !Count
- newtype Set = Set (Set ByteString)
- data SetOp
- newtype Map = Map MapContent
- type MapContent = Map MapField MapEntry
- data MapField = MapField MapEntryTag ByteString
- data MapEntry
- = MapCounter !Counter
- | MapSet !Set
- | MapRegister !Register
- | MapFlag !Flag
- | MapMap !Map
- xlookup :: MapPath -> MapEntryTag -> Map -> Maybe MapEntry
- data MapOp
- newtype MapPath = MapPath (NonEmpty ByteString)
- data MapValueOp
- mapUpdate :: IsMapOp o => MapPath -> o -> MapOp
- (-/) :: ByteString -> MapPath -> MapPath
- newtype Register = Register ByteString
- data RegisterOp = RegisterSet !ByteString
- newtype Flag = Flag Bool
- data FlagOp = FlagSet !Bool
- data NonEmpty a :: * -> * = a :| [a]
- mapEntryTag :: MapValueOp -> MapEntryTag
- setFromSeq :: Seq ByteString -> Set
- data MapEntryTag
Types
CRDT ADT.
get
operations return value of this type
Counters
CRDT Counter hold a integer Count
>>>
Counter 42
Modification
Counters can be incremented/decremented
>>>
CounterInc 1
Sets
CRDT Set is a Data.Set
>>>
Set (Data.Set.fromList ["foo","bar"])
Set (Set ByteString) |
Modification
CRDT Set operations
SetAdd ByteString | add element to the set
|
SetRemove ByteString | remove element from the set
|
Maps
CRDT Map is indexed by MapField, which is a name tagged by a type (there may be different entries with the same name, but different types)
CRDT Map holds values of type MapEntry
Inspection
xlookup :: MapPath -> MapEntryTag -> Map -> Maybe MapEntry Source #
Lookup a value of a given MapEntryTag
type on a given MapPath
inside a map
>>>
lookup ("a" -/ "b") MapFlagTag $ { "a"/Map: { "b"/Flag: Flag False } } -- pseudo
Just (MapFlag (Flag False))
Modification
map operations
It's easier to use mapUpdate
:
>>>
"x" -/ "y" -/ "z" `mapUpdate` SetAdd "elem"
MapUpdate (MapPath ("x" :| ["y","z"])) (MapCounterOp (CounterInc 1))
MapRemove MapField | remove value in map |
MapUpdate MapPath MapValueOp | update value on path by operation |
Selector (“xpath”) inside Map
data MapValueOp Source #
Operations on map values
Registers
Registers can only be held as a Map
element.
Register holds a ByteString
.
Modification
data RegisterOp Source #
Registers can be set to a value
>>>
RegisterSet "foo"
Flags
Modification
Flags can be enabled / disabled
>>>
FlagSet True
Misc
Non-empty (and non-strict) list type.
Since: 4.9.0.0
a :| [a] infixr 5 |
Monad NonEmpty | Since: 4.9.0.0 |
Functor NonEmpty | Since: 4.9.0.0 |
MonadFix NonEmpty | Since: 4.9.0.0 |
Applicative NonEmpty | Since: 4.9.0.0 |
Foldable NonEmpty | Since: 4.9.0.0 |
Traversable NonEmpty | Since: 4.9.0.0 |
ToJSON1 NonEmpty | |
FromJSON1 NonEmpty | |
Eq1 NonEmpty | Since: 4.10.0.0 |
Ord1 NonEmpty | Since: 4.10.0.0 |
Read1 NonEmpty | Since: 4.10.0.0 |
Show1 NonEmpty | Since: 4.10.0.0 |
MonadZip NonEmpty | Since: 4.9.0.0 |
NFData1 NonEmpty | Since: 1.4.3.0 |
IsList (NonEmpty a) | Since: 4.9.0.0 |
Eq a => Eq (NonEmpty a) | |
Data a => Data (NonEmpty a) | |
Ord a => Ord (NonEmpty a) | |
Read a => Read (NonEmpty a) | |
Show a => Show (NonEmpty a) | |
Generic (NonEmpty a) | |
Semigroup (NonEmpty a) | Since: 4.9.0.0 |
Hashable a => Hashable (NonEmpty a) | |
ToJSON a => ToJSON (NonEmpty a) | |
FromJSON a => FromJSON (NonEmpty a) | |
NFData a => NFData (NonEmpty a) | Since: 1.4.2.0 |
Generic1 * NonEmpty | |
type Rep (NonEmpty a) | |
type Item (NonEmpty a) | |
type Rep1 * NonEmpty | |
mapEntryTag :: MapValueOp -> MapEntryTag Source #
setFromSeq :: Seq ByteString -> Set Source #