55 lines
1.3 KiB
Haskell
55 lines
1.3 KiB
Haskell
module SpaceTraders
|
|
( SpaceTradersT
|
|
, microSinceEpoch
|
|
, newEnv
|
|
, runSpaceTradersT
|
|
, Env(..)
|
|
, HasDatabaseConn
|
|
, HasRequest
|
|
, ask
|
|
, getConn
|
|
, getLastAPICall
|
|
, getRequest
|
|
, liftIO
|
|
) where
|
|
|
|
import Control.Monad.IO.Class
|
|
import Control.Monad.Reader
|
|
import Data.IORef
|
|
import Data.Time.Clock
|
|
import Data.Time.Clock.POSIX
|
|
import qualified Database.SQLite.Simple as S
|
|
import Network.HTTP.Simple
|
|
|
|
type SpaceTradersT a = ReaderT Env IO a
|
|
|
|
newEnv :: S.Connection -> Request -> IO Env
|
|
newEnv conn req = do
|
|
r <- newIORef 0
|
|
return $ Env conn r req
|
|
|
|
runSpaceTradersT :: SpaceTradersT a -> Env -> IO a
|
|
runSpaceTradersT = runReaderT
|
|
|
|
microSinceEpoch :: IO Integer
|
|
microSinceEpoch = do
|
|
t <- getCurrentTime
|
|
return $ floor . (1e6 *) . nominalDiffTimeToSeconds $ utcTimeToPOSIXSeconds t
|
|
|
|
data Env = Env { envConn :: S.Connection
|
|
, envLastAPICall :: IORef Integer
|
|
, envRequest :: Request }
|
|
|
|
class HasDatabaseConn a where
|
|
getConn :: a -> S.Connection
|
|
instance HasDatabaseConn S.Connection where
|
|
getConn = id
|
|
instance HasDatabaseConn Env where
|
|
getConn = envConn
|
|
|
|
class HasRequest a where
|
|
getLastAPICall :: a -> IORef Integer
|
|
getRequest :: a -> Request
|
|
instance HasRequest Env where
|
|
getLastAPICall = envLastAPICall
|
|
getRequest = envRequest
|