packages feed

labsat-0.0.3: src/Labsat/Ctx.hs

{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell   #-}

module Labsat.Ctx where

import Data.Conduit.Network (AppData, clientSettings, runGeneralTCPClient)
import Preamble

data LabsatCtx = LabsatCtx
  { _lsStatsCtx  :: StatsCtx
  -- ^ Parent context
  , _lsAppData   :: AppData
  -- ^ AppData for runGeneralTCPClient
  , _lsDelay     :: Maybe Int
  -- ^ Command delay
  }

$(makeClassyConstraints ''LabsatCtx [''HasStatsCtx])

instance HasStatsCtx LabsatCtx where
  statsCtx = lsStatsCtx

instance HasCtx LabsatCtx where
  ctx = statsCtx . ctx

type MonadLabsatCtx c m =
  ( MonadStatsCtx c m
  , HasLabsatCtx c
  )

runLabsatCtx :: MonadStatsCtx c m => ByteString -> Int -> Maybe Int -> TransT LabsatCtx m a -> m a
runLabsatCtx host port timeout action =
  runGeneralTCPClient (clientSettings port host) $ \ad -> do
    e <- view statsCtx
    runTransT (LabsatCtx e ad timeout) action