{-# LANGUAGE DeriveDataTypeable, NamedFieldPuns, RecordWildCards,
ScopedTypeVariables, FlexibleContexts #-}
module Network.Riak.Connection.Pool
(
Pool
, client
, create
, idleTime
, maxConnections
, numStripes
, withConnection
, withConnectionM
) where
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Time.Clock (NominalDiffTime)
import Data.Typeable (Typeable)
import Network.Riak (Client(clientID), Connection, connect, disconnect)
import Network.Riak.Connection (makeClientID)
import qualified Data.Pool as Pool
data Pool = Pool {
Pool -> Client
client :: Client
, Pool -> Pool Connection
pool :: Pool.Pool Connection
} deriving (Typeable)
instance Show Pool where
show :: Pool -> String
show Pool
p = String
"Pool { client = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Client -> String
forall a. Show a => a -> String
show (Pool -> Client
client Pool
p) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", " String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
"numStripes = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Pool -> Int
numStripes Pool
p) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", " String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
"idleTime = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ NominalDiffTime -> String
forall a. Show a => a -> String
show (Pool -> NominalDiffTime
idleTime Pool
p) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
", " String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
"maxConnections = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Pool -> Int
maxConnections Pool
p) String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"}"
instance Eq Pool where
Pool
a == :: Pool -> Pool -> Bool
== Pool
b = Pool -> Client
client Pool
a Client -> Client -> Bool
forall a. Eq a => a -> a -> Bool
== Pool -> Client
client Pool
b Bool -> Bool -> Bool
&& Pool -> Int
numStripes Pool
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Pool -> Int
numStripes Pool
b Bool -> Bool -> Bool
&&
Pool -> NominalDiffTime
idleTime Pool
a NominalDiffTime -> NominalDiffTime -> Bool
forall a. Eq a => a -> a -> Bool
== Pool -> NominalDiffTime
idleTime Pool
b Bool -> Bool -> Bool
&& Pool -> Int
maxConnections Pool
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Pool -> Int
maxConnections Pool
b
create :: Client
-> Int
-> NominalDiffTime
-> Int
-> IO Pool
create :: Client -> Int -> NominalDiffTime -> Int -> IO Pool
create Client
client Int
ns NominalDiffTime
it Int
mc =
Client -> Pool Connection -> Pool
Pool Client
client (Pool Connection -> Pool) -> IO (Pool Connection) -> IO Pool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` IO Connection
-> (Connection -> IO ())
-> Int
-> NominalDiffTime
-> Int
-> IO (Pool Connection)
forall a.
IO a
-> (a -> IO ()) -> Int -> NominalDiffTime -> Int -> IO (Pool a)
Pool.createPool IO Connection
c Connection -> IO ()
disconnect Int
ns NominalDiffTime
it Int
mc
where c :: IO Connection
c = do
ClientID
cid <- IO ClientID
makeClientID
Client -> IO Connection
connect Client
client { clientID :: ClientID
clientID = ClientID
cid }
numStripes :: Pool -> Int
numStripes :: Pool -> Int
numStripes = Pool Connection -> Int
forall a. Pool a -> Int
Pool.numStripes (Pool Connection -> Int)
-> (Pool -> Pool Connection) -> Pool -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pool -> Pool Connection
pool
idleTime :: Pool -> NominalDiffTime
idleTime :: Pool -> NominalDiffTime
idleTime = Pool Connection -> NominalDiffTime
forall a. Pool a -> NominalDiffTime
Pool.idleTime (Pool Connection -> NominalDiffTime)
-> (Pool -> Pool Connection) -> Pool -> NominalDiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pool -> Pool Connection
pool
maxConnections :: Pool -> Int
maxConnections :: Pool -> Int
maxConnections = Pool Connection -> Int
forall a. Pool a -> Int
Pool.maxResources (Pool Connection -> Int)
-> (Pool -> Pool Connection) -> Pool -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pool -> Pool Connection
pool
withConnection :: Pool -> (Connection -> IO a) -> IO a
withConnection :: Pool -> (Connection -> IO a) -> IO a
withConnection = Pool Connection -> (Connection -> IO a) -> IO a
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
Pool a -> (a -> m b) -> m b
Pool.withResource (Pool Connection -> (Connection -> IO a) -> IO a)
-> (Pool -> Pool Connection)
-> Pool
-> (Connection -> IO a)
-> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pool -> Pool Connection
pool
withConnectionM :: MonadBaseControl IO m => Pool -> (Connection -> m a) -> m a
withConnectionM :: Pool -> (Connection -> m a) -> m a
withConnectionM = Pool Connection -> (Connection -> m a) -> m a
forall (m :: * -> *) a b.
MonadBaseControl IO m =>
Pool a -> (a -> m b) -> m b
Pool.withResource (Pool Connection -> (Connection -> m a) -> m a)
-> (Pool -> Pool Connection) -> Pool -> (Connection -> m a) -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pool -> Pool Connection
pool