riak 1.1.2.5 → 1.1.2.6
raw patch · 11 files changed
+213/−179 lines, 11 filesdep ~riak-protobufdep ~stmPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: riak-protobuf, stm
API changes (from Hackage documentation)
- Network.Riak.CRDT.Ops: instance Data.Semigroup.Semigroup Network.Riak.CRDT.Ops.SetOpsComb
- Network.Riak.CRDT.Types: instance Data.Semigroup.Semigroup Network.Riak.CRDT.Types.Counter
- Network.Riak.CRDT.Types: instance Data.Semigroup.Semigroup Network.Riak.CRDT.Types.CounterOp
- Network.Riak.CRDT.Types: instance Data.Semigroup.Semigroup Network.Riak.CRDT.Types.Flag
- Network.Riak.CRDT.Types: instance Data.Semigroup.Semigroup Network.Riak.CRDT.Types.Register
- Network.Riak.CRDT.Types: instance Data.Semigroup.Semigroup Network.Riak.CRDT.Types.Set
- Network.Riak.Cluster: instance GHC.Exception.Exception Network.Riak.Cluster.InClusterError
- Network.Riak.Connection.Internal: instance GHC.Exception.Exception Network.Riak.Protocol.ErrorResponse.ErrorResponse
- Network.Riak.JSON: instance Data.Semigroup.Semigroup a => Data.Semigroup.Semigroup (Network.Riak.JSON.JSON a)
- Network.Riak.Types.Internal: instance GHC.Exception.Exception Network.Riak.Types.Internal.RiakException
+ Network.Riak.CRDT.Ops: instance GHC.Base.Semigroup Network.Riak.CRDT.Ops.SetOpsComb
+ Network.Riak.CRDT.Types: instance GHC.Base.Semigroup Network.Riak.CRDT.Types.Counter
+ Network.Riak.CRDT.Types: instance GHC.Base.Semigroup Network.Riak.CRDT.Types.CounterOp
+ Network.Riak.CRDT.Types: instance GHC.Base.Semigroup Network.Riak.CRDT.Types.Flag
+ Network.Riak.CRDT.Types: instance GHC.Base.Semigroup Network.Riak.CRDT.Types.Register
+ Network.Riak.CRDT.Types: instance GHC.Base.Semigroup Network.Riak.CRDT.Types.Set
+ Network.Riak.Cluster: instance GHC.Exception.Type.Exception Network.Riak.Cluster.InClusterError
+ Network.Riak.Connection.Internal: instance GHC.Exception.Type.Exception Network.Riak.Protocol.ErrorResponse.ErrorResponse
+ Network.Riak.JSON: instance GHC.Base.Semigroup a => GHC.Base.Semigroup (Network.Riak.JSON.JSON a)
+ Network.Riak.Types.Internal: instance GHC.Exception.Type.Exception Network.Riak.Types.Internal.RiakException
- Network.Riak: foldKeys :: (MonadIO m) => Connection -> Maybe BucketType -> Bucket -> (a -> Key -> m a) -> a -> m a
+ Network.Riak: foldKeys :: MonadIO m => Connection -> Maybe BucketType -> Bucket -> (a -> Key -> m a) -> a -> m a
- Network.Riak.Basic: foldKeys :: (MonadIO m) => Connection -> Maybe BucketType -> Bucket -> (a -> Key -> m a) -> a -> m a
+ Network.Riak.Basic: foldKeys :: MonadIO m => Connection -> Maybe BucketType -> Bucket -> (a -> Key -> m a) -> a -> m a
- Network.Riak.CRDT.Types: MapPath :: (NonEmpty ByteString) -> MapPath
+ Network.Riak.CRDT.Types: MapPath :: NonEmpty ByteString -> MapPath
- Network.Riak.CRDT.Types: Set :: (Set ByteString) -> Set
+ Network.Riak.CRDT.Types: Set :: Set ByteString -> Set
- Network.Riak.CRDT.Types: data NonEmpty a :: * -> *
+ Network.Riak.CRDT.Types: data NonEmpty a
- Network.Riak.CRDT.Types: infixr 5 `mapUpdate`
+ Network.Riak.CRDT.Types: infixr 5 :|
- Network.Riak.Connection: pipeline :: (Exchange req resp) => Connection -> [req] -> IO [resp]
+ Network.Riak.Connection: pipeline :: Exchange req resp => Connection -> [req] -> IO [resp]
- Network.Riak.Connection: pipelineMaybe :: (Exchange req resp) => Connection -> [req] -> IO [Maybe resp]
+ Network.Riak.Connection: pipelineMaybe :: Exchange req resp => Connection -> [req] -> IO [Maybe resp]
- Network.Riak.Connection: pipeline_ :: (Request req) => Connection -> [req] -> IO ()
+ Network.Riak.Connection: pipeline_ :: Request req => Connection -> [req] -> IO ()
- Network.Riak.Connection.Internal: pipeline :: (Exchange req resp) => Connection -> [req] -> IO [resp]
+ Network.Riak.Connection.Internal: pipeline :: Exchange req resp => Connection -> [req] -> IO [resp]
- Network.Riak.Connection.Internal: pipelineMaybe :: (Exchange req resp) => Connection -> [req] -> IO [Maybe resp]
+ Network.Riak.Connection.Internal: pipelineMaybe :: Exchange req resp => Connection -> [req] -> IO [Maybe resp]
- Network.Riak.Connection.Internal: pipeline_ :: (Request req) => Connection -> [req] -> IO ()
+ Network.Riak.Connection.Internal: pipeline_ :: Request req => Connection -> [req] -> IO ()
- Network.Riak.Connection.Internal: recvMaybeResponse :: (Response a) => Connection -> IO (Maybe a)
+ Network.Riak.Connection.Internal: recvMaybeResponse :: Response a => Connection -> IO (Maybe a)
- Network.Riak.Connection.Internal: recvResponse :: (Response a) => Connection -> IO a
+ Network.Riak.Connection.Internal: recvResponse :: Response a => Connection -> IO a
- Network.Riak.Connection.Internal: sendRequest :: (Request req) => Connection -> req -> IO ()
+ Network.Riak.Connection.Internal: sendRequest :: Request req => Connection -> req -> IO ()
- Network.Riak.Content: data Content :: *
+ Network.Riak.Content: data Content
- Network.Riak.Content: data Link :: *
+ Network.Riak.Content: data Link
- Network.Riak.Debug: debugValues :: (Show a) => String -> String -> [a] -> IO ()
+ Network.Riak.Debug: debugValues :: Show a => String -> String -> [a] -> IO ()
- Network.Riak.Request: data DeleteRequest :: *
+ Network.Riak.Request: data DeleteRequest
- Network.Riak.Request: data GetBucketRequest :: *
+ Network.Riak.Request: data GetBucketRequest
- Network.Riak.Request: data GetClientIDRequest :: *
+ Network.Riak.Request: data GetClientIDRequest
- Network.Riak.Request: data GetRequest :: *
+ Network.Riak.Request: data GetRequest
- Network.Riak.Request: data GetServerInfoRequest :: *
+ Network.Riak.Request: data GetServerInfoRequest
- Network.Riak.Request: data IndexRequest :: *
+ Network.Riak.Request: data IndexRequest
- Network.Riak.Request: data Link :: *
+ Network.Riak.Request: data Link
- Network.Riak.Request: data ListBucketsRequest :: *
+ Network.Riak.Request: data ListBucketsRequest
- Network.Riak.Request: data ListKeysRequest :: *
+ Network.Riak.Request: data ListKeysRequest
- Network.Riak.Request: data MapReduceRequest :: *
+ Network.Riak.Request: data MapReduceRequest
- Network.Riak.Request: data PingRequest :: *
+ Network.Riak.Request: data PingRequest
- Network.Riak.Request: data PutRequest :: *
+ Network.Riak.Request: data PutRequest
- Network.Riak.Request: data SetBucketRequest :: *
+ Network.Riak.Request: data SetBucketRequest
- Network.Riak.Search: SearchResult :: !(Seq (Seq (ByteString, Maybe ByteString))) -> !(Maybe Float) -> !(Maybe Word32) -> SearchResult
+ Network.Riak.Search: SearchResult :: !Seq (Seq (ByteString, Maybe ByteString)) -> !Maybe Float -> !Maybe Word32 -> SearchResult
- Network.Riak.Search: [docs] :: SearchResult -> !(Seq (Seq (ByteString, Maybe ByteString)))
+ Network.Riak.Search: [docs] :: SearchResult -> !Seq (Seq (ByteString, Maybe ByteString))
- Network.Riak.Search: [maxScore] :: SearchResult -> !(Maybe Float)
+ Network.Riak.Search: [maxScore] :: SearchResult -> !Maybe Float
- Network.Riak.Search: [numFound] :: SearchResult -> !(Maybe Word32)
+ Network.Riak.Search: [numFound] :: SearchResult -> !Maybe Word32
- Network.Riak.Types: SearchResult :: !(Seq (Seq (ByteString, Maybe ByteString))) -> !(Maybe Float) -> !(Maybe Word32) -> SearchResult
+ Network.Riak.Types: SearchResult :: !Seq (Seq (ByteString, Maybe ByteString)) -> !Maybe Float -> !Maybe Word32 -> SearchResult
- Network.Riak.Types: [docs] :: SearchResult -> !(Seq (Seq (ByteString, Maybe ByteString)))
+ Network.Riak.Types: [docs] :: SearchResult -> !Seq (Seq (ByteString, Maybe ByteString))
- Network.Riak.Types: [maxScore] :: SearchResult -> !(Maybe Float)
+ Network.Riak.Types: [maxScore] :: SearchResult -> !Maybe Float
- Network.Riak.Types: [numFound] :: SearchResult -> !(Maybe Word32)
+ Network.Riak.Types: [numFound] :: SearchResult -> !Maybe Word32
- Network.Riak.Types.Internal: SearchResult :: !(Seq (Seq (ByteString, Maybe ByteString))) -> !(Maybe Float) -> !(Maybe Word32) -> SearchResult
+ Network.Riak.Types.Internal: SearchResult :: !Seq (Seq (ByteString, Maybe ByteString)) -> !Maybe Float -> !Maybe Word32 -> SearchResult
- Network.Riak.Types.Internal: [docs] :: SearchResult -> !(Seq (Seq (ByteString, Maybe ByteString)))
+ Network.Riak.Types.Internal: [docs] :: SearchResult -> !Seq (Seq (ByteString, Maybe ByteString))
- Network.Riak.Types.Internal: [maxScore] :: SearchResult -> !(Maybe Float)
+ Network.Riak.Types.Internal: [maxScore] :: SearchResult -> !Maybe Float
- Network.Riak.Types.Internal: [numFound] :: SearchResult -> !(Maybe Word32)
+ Network.Riak.Types.Internal: [numFound] :: SearchResult -> !Maybe Word32
- Network.Riak.Value: get :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> Key -> R -> IO (Maybe ([c], VClock))
+ Network.Riak.Value: get :: IsContent c => Connection -> Maybe BucketType -> Bucket -> Key -> R -> IO (Maybe ([c], VClock))
- Network.Riak.Value: getMany :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> [Key] -> R -> IO [Maybe ([c], VClock)]
+ Network.Riak.Value: getMany :: IsContent c => Connection -> Maybe BucketType -> Bucket -> [Key] -> R -> IO [Maybe ([c], VClock)]
- Network.Riak.Value: put :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> Key -> Maybe VClock -> c -> W -> DW -> IO ([c], VClock)
+ Network.Riak.Value: put :: IsContent c => Connection -> Maybe BucketType -> Bucket -> Key -> Maybe VClock -> c -> W -> DW -> IO ([c], VClock)
- Network.Riak.Value: putIndexed :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> Key -> [IndexValue] -> Maybe VClock -> c -> W -> DW -> IO ([c], VClock)
+ Network.Riak.Value: putIndexed :: IsContent c => Connection -> Maybe BucketType -> Bucket -> Key -> [IndexValue] -> Maybe VClock -> c -> W -> DW -> IO ([c], VClock)
- Network.Riak.Value: putMany :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> [(Key, Maybe VClock, c)] -> W -> DW -> IO [([c], VClock)]
+ Network.Riak.Value: putMany :: IsContent c => Connection -> Maybe BucketType -> Bucket -> [(Key, Maybe VClock, c)] -> W -> DW -> IO [([c], VClock)]
- Network.Riak.Value: putMany_ :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> [(Key, Maybe VClock, c)] -> W -> DW -> IO ()
+ Network.Riak.Value: putMany_ :: IsContent c => Connection -> Maybe BucketType -> Bucket -> [(Key, Maybe VClock, c)] -> W -> DW -> IO ()
- Network.Riak.Value: put_ :: (IsContent c) => Connection -> Maybe BucketType -> Bucket -> Key -> Maybe VClock -> c -> W -> DW -> IO ()
+ Network.Riak.Value: put_ :: IsContent c => Connection -> Maybe BucketType -> Bucket -> Key -> Maybe VClock -> c -> W -> DW -> IO ()
Files
- Changes.md +4/−0
- riak.cabal +4/−4
- src/Network/Riak/Basic.hs +20/−17
- src/Network/Riak/CRDT.hs +29/−34
- src/Network/Riak/CRDT/Ops.hs +30/−25
- src/Network/Riak/CRDT/Request.hs +14/−7
- src/Network/Riak/CRDT/Response.hs +17/−12
- src/Network/Riak/CRDT/Riak.hs +23/−13
- src/Network/Riak/CRDT/Types.hs +67/−63
- src/Network/Riak/Connection.hs +1/−1
- src/Network/Riak/Connection/NoPush.hsc +4/−3
Changes.md view
@@ -1,3 +1,7 @@+* 1.1.2.6+ - Regenerate protobuf for protocol-buffers 2.4.12. (https://github.com/riak-haskell-client/riak-haskell-client/issues/115)+ - Bump riak-protobuf version to 0.24.0.0.+ - Bump riak-protobuf-lens version to 0.24.0.0. * 1.1.2.5 - Bump aeson and exceptions upper bounds. * 1.1.2.4
riak.cabal view
@@ -1,5 +1,5 @@ name: riak-version: 1.1.2.5+version: 1.1.2.6 synopsis: A Haskell client for the Riak decentralized data store description: A Haskell client library for the Riak decentralized data@@ -47,7 +47,7 @@ tests/test.yaml cabal-version: >=1.8-+tested-with: GHC==8.4.4, GHC==8.2.2, GHC==8.0.2 source-repository head type: git location: https://github.com:riak-haskell-client/riak-haskell-client.git@@ -124,9 +124,9 @@ protocol-buffers >= 2.1.4 && < 2.5, pureMD5, random,- riak-protobuf == 0.23.*,+ riak-protobuf == 0.24.*, semigroups >= 0.16,- stm == 2.4.*,+ stm >= 2.4 && < 2.6, text == 1.2.*, time >= 1.4.2 && < 1.9, vector >= 0.10.12.3 && < 0.13,
src/Network/Riak/Basic.hs view
@@ -1,4 +1,7 @@-{-# LANGUAGE BangPatterns, OverloadedStrings, RecordWildCards, CPP #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-} -- | -- Module: Network.Riak.Basic@@ -45,23 +48,23 @@ ) where #if __GLASGOW_HASKELL__ < 710-import Control.Applicative ((<$>))+import Control.Applicative ((<$>)) #endif-import Control.Monad.IO.Class-import Data.Maybe (fromMaybe)-import Network.Riak.Connection.Internal-import Network.Riak.Escape (unescape)-import Network.Riak.Protocol.BucketProps-import Network.Riak.Protocol.Content-import Network.Riak.Protocol.ListKeysResponse-import Network.Riak.Protocol.MapReduce as MapReduce-import Network.Riak.Protocol.ServerInfo-import Network.Riak.Types.Internal hiding (MessageTag(..))-import qualified Data.Foldable as F-import qualified Data.Sequence as Seq-import qualified Network.Riak.Request as Req-import qualified Network.Riak.Response as Resp-import qualified Network.Riak.Types.Internal as T+import Control.Monad.IO.Class+import qualified Data.Foldable as F+import Data.Maybe (fromMaybe)+import qualified Data.Sequence as Seq+import Network.Riak.Connection.Internal+import Network.Riak.Escape (unescape)+import Network.Riak.Protocol.BucketProps+import Network.Riak.Protocol.Content+import Network.Riak.Protocol.ListKeysResponse+import Network.Riak.Protocol.MapReduce as MapReduce+import Network.Riak.Protocol.ServerInfo+import qualified Network.Riak.Request as Req+import qualified Network.Riak.Response as Resp+import Network.Riak.Types.Internal hiding (MessageTag (..))+import qualified Network.Riak.Types.Internal as T -- | Check to see if the connection to the server is alive. ping :: Connection -> IO ()
src/Network/Riak/CRDT.hs view
@@ -1,4 +1,11 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+ {- | module: Network.Riak.CRDT copyright: (c) 2016 Sentenai author: Antonio Nikishaev <me@lelf.lu>@@ -11,7 +18,7 @@ * Haskell values: 'Counter', 'Set' etc * ADT for operations: 'CounterOp', 'SetOp' etc- + * 'modify' to locally modify a value (matching riak-side behaviour) * Riak-side@@ -32,45 +39,38 @@ Just (DTCounter (Counter 42)) -}-{-# LANGUAGE TypeFamilies, OverloadedStrings, ScopedTypeVariables, PatternGuards #-}-{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} -module Network.Riak.CRDT (module Network.Riak.CRDT.Types,- get,- CRDT(..))- where-+module Network.Riak.CRDT (+ module X+ , get+ , CRDT(..)+ ) where -import Data.Default.Class-import qualified Data.Map as M-import Data.Proxy+import Data.Default.Class+import qualified Data.Map as M+import Data.Proxy #if __GLASGOW_HASKELL__ < 804-import Data.Semigroup+import Data.Semigroup #endif-import qualified Data.Set as S-import Network.Riak.CRDT.Ops-import Network.Riak.CRDT.Riak-import Network.Riak.CRDT.Types-import Network.Riak.Types-+import qualified Data.Set as S+import Network.Riak.CRDT.Ops+import Network.Riak.CRDT.Riak+import Network.Riak.CRDT.Types as X+import Network.Riak.Types -- | Modify a counter by applying operations ops modifyCounter :: CounterOp -> Counter -> Counter modifyCounter op c = c <> Counter i where CounterInc i = op -- -- | Modify a set by applying operations ops modifySet :: SetOp -> Set -> Set modifySet op (Set c) = Set (c `S.union` adds S.\\ rems) where SetOpsComb adds rems = toOpsComb op - modifyMap :: MapOp -> Map -> Map modifyMap (MapRemove field) (Map mc) = Map $ M.delete field mc-modifyMap (MapUpdate path op) m = modifyMap1 path op m-+modifyMap (MapUpdate path op) m = modifyMap1 path op m modifyMap1 :: MapPath -> MapValueOp -> Map -> Map modifyMap1 (MapPath (e :| [])) op m = modMap mf op m@@ -85,7 +85,6 @@ modMap :: MapField -> MapValueOp -> Map -> Map modMap ix op (Map m) = Map $ M.alter (Just . modifyMapValue op) ix m - modifyMapValue :: MapValueOp -> Maybe MapEntry -> MapEntry modifyMapValue (MapSetOp op) = modifyEntry (Proxy :: Proxy Set) op modifyMapValue (MapCounterOp op) = modifyEntry (Proxy :: Proxy Counter) op@@ -93,14 +92,12 @@ modifyMapValue (MapFlagOp op) = modifyEntry (Proxy :: Proxy Flag) op modifyMapValue (MapRegisterOp op) = modifyEntry (Proxy :: Proxy Register) op - modifyFlag :: FlagOp -> Flag -> Flag modifyFlag (FlagSet x) = const (Flag x) modifyRegister :: RegisterOp -> Register -> Register modifyRegister (RegisterSet x) = const (Register x) - -- | Types that can be held inside 'Map' class Default a => MapCRDT a where type MapOperation_ a :: *@@ -119,38 +116,36 @@ type MapOperation_ Flag = FlagOp mapModify = modifyFlag fromEntry (MapFlag f) = Just f- fromEntry _ = Nothing+ fromEntry _ = Nothing toEntry = MapFlag instance MapCRDT Set where type MapOperation_ Set = SetOp mapModify = modify fromEntry (MapSet s) = Just s- fromEntry _ = Nothing+ fromEntry _ = Nothing toEntry = MapSet instance MapCRDT Counter where type MapOperation_ Counter = CounterOp mapModify = modify fromEntry (MapCounter s) = Just s- fromEntry _ = Nothing+ fromEntry _ = Nothing toEntry = MapCounter instance MapCRDT Register where type MapOperation_ Register = RegisterOp mapModify = modifyRegister fromEntry (MapRegister s) = Just s- fromEntry _ = Nothing+ fromEntry _ = Nothing toEntry = MapRegister - instance MapCRDT Map where type MapOperation_ Map = MapOp mapModify = modify fromEntry (MapMap s) = Just s- fromEntry _ = Nothing+ fromEntry _ = Nothing toEntry = MapMap- -- | CRDT types class MapCRDT a => CRDT a op | a -> op, op -> a where
src/Network/Riak/CRDT/Ops.hs view
@@ -1,32 +1,37 @@--- | module: Network.Riak.CRDT.Ops--- copyright: (c) 2016 Sentenai--- author: Antonio Nikishaev <me@lelf.lu>--- license: Apache+-- |+-- Module: Network.Riak.CRDT.Ops+-- Copyright: (c) 2016 Sentenai+-- Author: Antonio Nikishaev <me@lelf.lu>+-- License: Apache+-- Maintainer: Tim McGilchrist <timmcgil@gmail.com>, Mark Hibberd <mark@hibberd.id.au>+-- Stability: experimental+-- Portability: portable --+-- -- Conversions of CRDT operations to 'PB.DtOp' ---module Network.Riak.CRDT.Ops (counterUpdateOp,- setUpdateOp, SetOpsComb(..), toOpsComb,- mapUpdateOp)- where--import qualified Network.Riak.Protocol.DtOp as PB-import qualified Network.Riak.Protocol.CounterOp as PB-import qualified Network.Riak.Protocol.SetOp as PBSet--import qualified Network.Riak.Protocol.MapOp as PBMap-import qualified Network.Riak.Protocol.MapField as PBMap-import qualified Network.Riak.Protocol.MapField.MapFieldType as PBMap-import qualified Network.Riak.Protocol.MapUpdate as PBMap+module Network.Riak.CRDT.Ops (+ counterUpdateOp+ , setUpdateOp+ , SetOpsComb(..)+ , toOpsComb+ , mapUpdateOp+ ) where -import qualified Network.Riak.Protocol.MapUpdate.FlagOp as PBFlag+import Data.ByteString.Lazy (ByteString)+import Data.Semigroup (Semigroup ((<>)))+import qualified Data.Sequence as Seq+import qualified Data.Set as S -import Data.ByteString.Lazy (ByteString)-import Data.Semigroup (Semigroup((<>)))-import qualified Data.Sequence as Seq-import qualified Data.Set as S import Network.Riak.CRDT.Types-+import qualified Network.Riak.Protocol.CounterOp as PB+import qualified Network.Riak.Protocol.DtOp as PB+import qualified Network.Riak.Protocol.MapField as PBMap+import qualified Network.Riak.Protocol.MapField.MapFieldType as PBMap+import qualified Network.Riak.Protocol.MapOp as PBMap+import qualified Network.Riak.Protocol.MapUpdate as PBMap+import qualified Network.Riak.Protocol.MapUpdate.FlagOp as PBFlag+import qualified Network.Riak.Protocol.SetOp as PBSet counterUpdateOp :: [CounterOp] -> PB.DtOp counterUpdateOp ops = PB.DtOp { PB.counter_op = Just $ counterOpPB ops,@@ -39,7 +44,7 @@ where CounterInc i = mconcat ops -data SetOpsComb = SetOpsComb { setAdds :: S.Set ByteString,+data SetOpsComb = SetOpsComb { setAdds :: S.Set ByteString, setRemoves :: S.Set ByteString } deriving (Show) @@ -51,7 +56,7 @@ (SetOpsComb a b) `mappend` (SetOpsComb x y) = SetOpsComb (a<>x) (b<>y) toOpsComb :: SetOp -> SetOpsComb-toOpsComb (SetAdd s) = SetOpsComb (S.singleton s) S.empty+toOpsComb (SetAdd s) = SetOpsComb (S.singleton s) S.empty toOpsComb (SetRemove s) = SetOpsComb S.empty (S.singleton s)
src/Network/Riak/CRDT/Request.hs view
@@ -1,10 +1,18 @@--- | module: Network.Riak.CRDT.Request--- copyright: (c) 2016 Sentenai--- author: Antonio Nikishaev <me@lelf.lu>--- license: Apache+-- |+-- Module: Network.Riak.CRDT.Request+-- Copyright: (c) 2016 Sentenai+-- Author: Antonio Nikishaev <me@lelf.lu>+-- License: Apache+-- Maintainer: Tim McGilchrist <timmcgil@gmail.com>, Mark Hibberd <mark@hibberd.id.au>+-- Stability: experimental+-- Portability: portable ---module Network.Riak.CRDT.Request- (get, counterUpdate, setUpdate, mapUpdate) where+module Network.Riak.CRDT.Request (+ get+ , counterUpdate+ , setUpdate+ , mapUpdate+ ) where import Data.ByteString.Lazy (ByteString) import Network.Riak.CRDT.Ops@@ -28,7 +36,6 @@ -> BucketType -> Bucket -> Key -> DtUpdate.DtUpdateRequest mapUpdate ops = update (mapUpdateOp ops)- update :: DtOp.DtOp -> BucketType -> Bucket -> Key -> DtUpdate.DtUpdateRequest update op t b k = DtUpdate.DtUpdateRequest {
src/Network/Riak/CRDT/Response.hs view
@@ -1,29 +1,34 @@--- | module: Network.Riak.CRDT.Response--- copyright: (c) 2016 Sentenai--- author: Antonio Nikishaev <me@lelf.lu>--- license: Apache+-- |+-- Module: Network.Riak.CRDT.Response+-- Copyright: (c) 2016 Sentenai+-- Author: Antonio Nikishaev <me@lelf.lu>+-- License: Apache+-- Maintainer: Tim McGilchrist <timmcgil@gmail.com>, Mark Hibberd <mark@hibberd.id.au>+-- Stability: experimental+-- Portability: portable --+ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE CPP #-} module Network.Riak.CRDT.Response (get) where #if __GLASGOW_HASKELL__ <= 708-import Control.Applicative ((<$>))-import Data.Traversable+import Control.Applicative ((<$>))+import Data.Traversable #endif import qualified Data.Sequence as Seq import qualified Data.Map as Map-import Data.Foldable (toList)-import Data.Maybe-import Network.Riak.Protocol.DtFetchResponse (DtFetchResponse,value,type')-import Network.Riak.Protocol.DtFetchResponse.DataType (DataType(..))-import Network.Riak.Protocol.DtValue (counter_value,set_value,map_value)+import Data.Foldable (toList)+import Data.Maybe (catMaybes)+import Network.Riak.Protocol.DtFetchResponse (DtFetchResponse,value,type')+import Network.Riak.Protocol.DtFetchResponse.DataType (DataType(..))+import Network.Riak.Protocol.DtValue (counter_value,set_value,map_value) import qualified Network.Riak.Protocol.MapEntry as M (MapEntry(..)) import qualified Network.Riak.Protocol.MapField as M import qualified Network.Riak.Protocol.MapField.MapFieldType as M -import Network.Riak.CRDT.Types as CRDT+import Network.Riak.CRDT.Types as CRDT get :: DtFetchResponse -> Maybe CRDT.DataType get resp = case type' resp of
src/Network/Riak/CRDT/Riak.hs view
@@ -1,31 +1,41 @@--- | module: Network.Riak.CRDT.Riak--- copyright: (c) 2016 Sentenai--- author: Antonio Nikishaev <me@lelf.lu>--- license: Apache+-- |+-- Module: Network.Riak.CRDT.Riak+-- Copyright: (c) 2016 Sentenai+-- Author: Antonio Nikishaev <me@lelf.lu>+-- License: Apache+-- Maintainer: Tim McGilchrist <timmcgil@gmail.com>, Mark Hibberd <mark@hibberd.id.au>+-- Stability: experimental+-- Portability: portable -- -- CRDT operations+-- {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE CPP #-} -module Network.Riak.CRDT.Riak (counterSendUpdate,- setSendUpdate,- mapSendUpdate,- get)- where+module Network.Riak.CRDT.Riak (+ counterSendUpdate+ , setSendUpdate+ , mapSendUpdate+ , get+ ) where+ #if __GLASGOW_HASKELL__ <= 708 import Control.Applicative import Data.Int #endif-import qualified Network.Riak.CRDT.Types as CRDT-import qualified Network.Riak.Connection as Conn-import Network.Riak.Types-import qualified Network.Riak.Protocol.ErrorResponse as ER+ import Control.Exception (catchJust)+ import qualified Data.ByteString.Lazy as BS+ import qualified Network.Riak.CRDT.Request as Req import qualified Network.Riak.CRDT.Response as Resp+import qualified Network.Riak.CRDT.Types as CRDT+import qualified Network.Riak.Connection as Conn+import qualified Network.Riak.Protocol.ErrorResponse as ER+import Network.Riak.Types counterSendUpdate :: Connection -> BucketType -> Bucket -> Key
src/Network/Riak/CRDT/Types.hs view
@@ -1,57 +1,62 @@--- | module: Network.Riak.CRDT.Types--- copyright: (c) 2016 Sentenai--- author: Antonio Nikishaev <me@lelf.lu>--- license: Apache--- +-- |+-- Module: Network.Riak.CRDT.Types+-- Copyright: (c) 2016 Sentenai+-- Author: Antonio Nikishaev <me@lelf.lu>+-- License: Apache+-- Maintainer: Tim McGilchrist <timmcgil@gmail.com>, Mark Hibberd <mark@hibberd.id.au>+-- Stability: experimental+-- Portability: portable+-- -- Haskell-side view of CRDT--- -{-# LANGUAGE OverloadedStrings, PatternGuards, GeneralizedNewtypeDeriving, DeriveGeneric #-}-+--+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE DeriveGeneric #-} module Network.Riak.CRDT.Types (- -- * Types- DataType(..),- -- ** Counters- Counter(..), Count,- -- *** Modification- CounterOp(..),- -- ** Sets- Set(..),- -- *** Modification- SetOp(..),- -- ** Maps- Map(..), MapContent,- MapField(..),- MapEntry(..),- -- *** Inspection- xlookup,- -- *** Modification- MapOp(..), MapPath(..), MapValueOp(..), mapUpdate, (-/),- -- ** Registers- Register(..),- -- *** Modification- RegisterOp(..),- -- ** Flags- Flag(..),- -- *** Modification- FlagOp(..),- -- * Misc- NonEmpty(..), mapEntryTag, setFromSeq, MapEntryTag(..))- where-+ -- * Types+ DataType(..)+ -- ** Counters+ , Counter(..), Count+ -- *** Modification+ , CounterOp(..)+ -- ** Sets+ , Set(..)+ -- *** Modification+ , SetOp(..)+ -- ** Maps+ , Map(..), MapContent+ , MapField(..)+ , MapEntry(..)+ -- *** Inspection+ , xlookup+ -- *** Modification+ , MapOp(..), MapPath(..), MapValueOp(..), mapUpdate, (-/)+ -- ** Registers+ , Register(..)+ -- *** Modification+ , RegisterOp(..)+ -- ** Flags+ , Flag(..)+ -- *** Modification+ , FlagOp(..)+ -- * Misc+ , NonEmpty(..), mapEntryTag, setFromSeq, MapEntryTag(..)+ ) where +import Control.DeepSeq (NFData)+import Data.ByteString.Lazy (ByteString)+import Data.Default.Class+import qualified Data.Foldable as F+import Data.Int (Int64)+import Data.List.NonEmpty import qualified Data.Map.Strict as M-import qualified Data.Set as S+import Data.Semigroup import qualified Data.Sequence as Seq-import qualified Data.Foldable as F-import Data.ByteString.Lazy (ByteString)-import Data.Int (Int64)-import Data.List.NonEmpty-import Data.Semigroup-import Data.Default.Class-import Control.DeepSeq (NFData)-import GHC.Generics (Generic)-import Data.String+import qualified Data.Set as S+import Data.String (IsString(..))+import GHC.Generics (Generic) -- | CRDT Map is indexed by MapField, which is a name tagged by a type@@ -63,7 +68,7 @@ -- | CRDT Map is a Data.Map indexed by 'MapField' and holding -- 'MapEntry'.--- +-- -- Maps are specials in a way that they can additionally -- hold 'Flag's, 'Register's, and most importantly, other 'Map's. newtype Map = Map MapContent deriving (Eq,Show,Generic)@@ -109,7 +114,7 @@ -- | map operations -- It's easier to use 'mapUpdate':--- +-- -- >>> "x" -/ "y" -/ "z" `mapUpdate` SetAdd "elem" -- MapUpdate (MapPath ("x" :| ["y","z"])) (MapCounterOp (CounterInc 1)) data MapOp = MapRemove MapField -- ^ remove value in map@@ -147,7 +152,7 @@ -- | 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)) xlookup :: MapPath -> MapEntryTag -> Map -> Maybe MapEntry@@ -161,19 +166,19 @@ -- | Registers can be set to a value--- +-- -- >>> RegisterSet "foo" data RegisterOp = RegisterSet !ByteString deriving (Eq,Show) -- | Flags can be enabled / disabled--- +-- -- >>> FlagSet True data FlagOp = FlagSet !Bool deriving (Eq,Show) -- | Flags can only be held as a 'Map' element.--- +-- -- Flag can be set or unset--- +-- -- >>> Flag False newtype Flag = Flag Bool deriving (Eq,Ord,Show,Generic) @@ -192,7 +197,7 @@ def = mempty -- | Registers can only be held as a 'Map' element.--- +-- -- Register holds a 'ByteString'. newtype Register = Register ByteString deriving (Eq,Show,Generic) @@ -221,7 +226,7 @@ -- | CRDT ADT.--- +-- -- 'Network.Riak.CRDT.Riak.get' operations return value of this type data DataType = DTCounter Counter | DTSet Set@@ -231,7 +236,7 @@ instance NFData DataType -- | CRDT Set is a Data.Set--- +-- -- >>> Set (Data.Set.fromList ["foo","bar"]) newtype Set = Set (S.Set ByteString) deriving (Eq,Ord,Show,Generic,Monoid) @@ -245,10 +250,10 @@ -- | CRDT Set operations data SetOp = SetAdd ByteString -- ^ add element to the set- -- + -- -- >>> SetAdd "foo" | SetRemove ByteString -- ^ remove element from the set- -- + -- -- >>> SetRemove "bar" deriving (Eq,Show) @@ -256,7 +261,7 @@ setFromSeq = Set . S.fromList . F.toList -- | CRDT Counter hold a integer 'Count'--- +-- -- >>> Counter 42 newtype Counter = Counter Count deriving (Eq,Ord,Num,Show,Generic) type Count = Int64@@ -274,7 +279,7 @@ def = mempty -- | Counters can be incremented/decremented--- +-- -- >>> CounterInc 1 data CounterOp = CounterInc !Count deriving (Eq,Show) @@ -284,4 +289,3 @@ instance Monoid CounterOp where mempty = CounterInc 0 CounterInc x `mappend` CounterInc y = CounterInc . getSum $ Sum x <> Sum y-
src/Network/Riak/Connection.hs view
@@ -27,4 +27,4 @@ , pipeline_ ) where -import Network.Riak.Connection.Internal+import Network.Riak.Connection.Internal
src/Network/Riak/Connection/NoPush.hsc view
@@ -21,7 +21,7 @@ import Foreign.Marshal.Utils (with) import Foreign.Ptr (Ptr) import Foreign.Storable (sizeOf)-import Network.Socket (Socket(..), fdSocket)+import Network.Socket (Socket, fdSocket) noPush :: CInt #if defined(TCP_NOPUSH)@@ -41,8 +41,9 @@ setNoPush s onOff = do let v = if onOff then 1 else 0 with v $ \ptr ->- throwErrnoIfMinus1_ "setNoPush" $- c_setsockopt (fdSocket s) (#const IPPROTO_TCP) noPush ptr (fromIntegral (sizeOf v))+ throwErrnoIfMinus1_ "setNoPush" $ do+ a <- (fdSocket s)+ c_setsockopt a (#const IPPROTO_TCP) noPush ptr (fromIntegral (sizeOf v)) foreign import ccall unsafe "setsockopt" c_setsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> CInt -> IO CInt