packages feed

captcha-core-0.1.0.0: src/Captcha/Internal/Monad.hs

{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE TemplateHaskell #-}

-- |
-- Module: Captcha.Internal.Monad
-- Copyright: (c) 2022 Edward Yang
-- License: MIT
--
-- This module is for internal-use and does not follow pvp versioning policies.
module Captcha.Internal.Monad where

import Control.Lens.TH (makeClassy)
import Control.Monad.Cont (MonadIO (liftIO))
import Control.Monad.Reader (MonadReader, ReaderT (ReaderT))
import Network.Wreq.Session (Session, newSession)
import UnliftIO (MonadUnliftIO)

-- | Effect providing an environment required to solve captchas.
newtype Captcha a = Captcha
  { runCaptcha :: CaptchaEnv -> IO a
  }
  deriving
    ( Functor,
      Applicative,
      Monad,
      MonadIO,
      MonadReader CaptchaEnv,
      MonadUnliftIO
    )
    via ReaderT CaptchaEnv IO

-- | Provides an HTTP 'Session' to be reused for each request.
newtype CaptchaEnv = CaptchaEnv
  { _session :: Session
  }

makeClassy ''CaptchaEnv

-- | Create the environment required to solve captchas.
mkCaptchaEnv :: MonadIO m => m CaptchaEnv
mkCaptchaEnv = CaptchaEnv <$> liftIO newSession