packages feed

labsat-0.0.1: 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
  , _lsAppData   :: AppData
  }

$(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 -> TransT LabsatCtx m a -> m a
runLabsatCtx host port action =
  runGeneralTCPClient (clientSettings port host) $ \ad -> do
    e <- view statsCtx
    runTransT (LabsatCtx e ad) action