multipool 0.1.0.1 → 0.2.0.0
raw patch · 2 files changed
+28/−17 lines, 2 files
Files
- multipool.cabal +6/−5
- src/Data/MultiPool.hs +22/−12
multipool.cabal view
@@ -1,11 +1,13 @@--- This file has been generated from package.yaml by hpack version 0.28.2.+cabal-version: 1.12++-- This file has been generated from package.yaml by hpack version 0.31.1. -- -- see: https://github.com/sol/hpack ----- hash: 94857348efe4280780cf43aafdfa4d309b7f052c478231a8894f01882519533b+-- hash: 038273645193a39608f132b11aa88c25325bba2abb8d3f74b86f4a90a376e90c name: multipool-version: 0.1.0.1+version: 0.2.0.0 synopsis: Generalized system for reading and writing to distributed systems that have primary/replica topologies. description: Please see the README on GitHub at <https://github.com/iand675/multipool#readme> category: Database@@ -17,10 +19,9 @@ license: BSD3 license-file: LICENSE build-type: Simple-cabal-version: >= 1.10 extra-source-files:- ChangeLog.md README.md+ ChangeLog.md source-repository head type: git
src/Data/MultiPool.hs view
@@ -43,38 +43,48 @@ instance (Show (InstanceDoesNotExist backend), Typeable backend) => Exception (InstanceDoesNotExist backend) class Monad m => MultiPoolBackend m backend where- type Masters backend :: *- type Masters backend = Pool (MasterConnection backend)+ type Primaries backend :: *+ type Primaries backend = Pool (PrimaryConnection backend) type Replicas backend :: * type Replicas backend = HashMap (ReplicaIdentifier backend) (Pool (ReplicaConnection backend)) - type MasterConnection backend :: *+ type LocalPrimary backend :: *+ type LocalPrimary backend = LocalPool (PrimaryConnection backend)+ type LocalReplica backend :: *+ type LocalReplica backend = LocalPool (ReplicaConnection backend)++ type PrimaryConnection backend :: * type ReplicaConnection backend :: * - type MasterIdentifier backend :: *- type MasterIdentifier backend = ()+ type PrimaryIdentifier backend :: *+ type PrimaryIdentifier backend = () type ReplicaIdentifier backend :: * type ReplicaIdentifier backend = InstanceName backend - runWriteAny :: MultiPool backend -> ReaderT (MasterConnection backend) m a -> m a- runWrite :: MultiPool backend -> MasterIdentifier backend -> ReaderT (MasterConnection backend) m a -> m a+ runWriteAny :: MultiPool backend -> ReaderT (PrimaryConnection backend) m a -> m a+ runWrite :: MultiPool backend -> PrimaryIdentifier backend -> ReaderT (PrimaryConnection backend) m a -> m a - runReadMaster :: MultiPool backend -> MasterIdentifier backend -> ReaderT (ReplicaConnection backend) m a -> m a- runReadAnyMaster :: MultiPool backend -> ReaderT (ReplicaConnection backend) m a -> m a+ runReadPrimary :: MultiPool backend -> PrimaryIdentifier backend -> ReaderT (ReplicaConnection backend) m a -> m a+ runReadAnyPrimary :: MultiPool backend -> ReaderT (ReplicaConnection backend) m a -> m a runReadAny :: MultiPool backend -> ReaderT (ReplicaConnection backend) m a -> m a runRead :: MultiPool backend -> ReplicaIdentifier backend -> ReaderT (ReplicaConnection backend) m a -> m a + takePrimary :: MultiPool backend -> PrimaryIdentifier backend -> m (PrimaryConnection backend, LocalPrimary backend)+ putPrimary :: MultiPool backend -> LocalPrimary backend -> PrimaryConnection backend -> m () + takeReplica :: MultiPool backend -> ReplicaIdentifier backend -> m (ReplicaConnection backend, LocalReplica backend)+ putReplica :: MultiPool backend -> LocalReplica backend -> ReplicaConnection backend -> m ()+ -- Invariant: MultiPool should not be modified after creation? data MultiPool backend = MultiPool- { multiPoolMaster :: !(Masters backend)+ { multiPoolPrimary :: !(Primaries backend) , multiPoolReplica :: !(Replicas backend)- , multiPoolAnyMasterSelector :: MultiPool backend -> IO (MasterIdentifier backend)+ , multiPoolAnyPrimarySelector :: MultiPool backend -> IO (PrimaryIdentifier backend) , multiPoolAnyReplicaSelector :: MultiPool backend -> IO (Maybe (ReplicaIdentifier backend)) } forReplicas :: (MultiPoolBackend m backend, Replicas backend ~ HashMap k v) => MultiPool backend -> (k -> v -> m a) -> m [a]-forReplicas pool f = forM (HM.toList (multiPoolReplica pool)) $ \(k, v) -> f k v+forReplicas pool f = forM (HM.toList $ multiPoolReplica pool) $ \(k, v) -> f k v roundRobin :: MonadIO m => [choice] -> m (a -> IO (Maybe choice)) roundRobin [] = return $ const $ return Nothing