packages feed

hw-polysemy-0.3.0.2: hedgehog/HaskellWorks/Polysemy/Hedgehog/Property.hs

module HaskellWorks.Polysemy.Hedgehog.Property
  ( Property,
    property,
    propertyOnce,
  ) where

import qualified GHC.Stack                                      as GHC
import           HaskellWorks.Polysemy.Prelude

import           Hedgehog                                       (Property)
import qualified Hedgehog                                       as H

import           Control.Monad.IO.Class                         (liftIO)
import           HaskellWorks.Polysemy.Hedgehog.Effect.Hedgehog
import           HaskellWorks.Polysemy.Hedgehog.Effect.Log
import           HaskellWorks.Polysemy.Log
import           Polysemy
import           Polysemy.Embed
import           Polysemy.Log
import           Polysemy.Resource
import           Polysemy.Time.Interpreter.Ghc

property :: ()
  => Sem
        [ Log
        , DataLog (LogEntry LogMessage)
        , DataLog Text
        , GhcTime
        , Hedgehog
        , Embed IO
        , Embed (H.PropertyT IO)
        , Resource
        , Final (H.PropertyT IO)
        ] ()
  -> H.Property
property f =
    f & interpretLogDataLog
      & setLogLevelFromEnv "LOG_LEVEL" Info
      & interpretDataLogHedgehog formatLogEntry getLogEntryCallStack
      & interpretDataLogHedgehog id (const GHC.callStack)
      & interpretTimeGhc
      & hedgehogToPropertyFinal
      & runEmbedded liftIO
      & embedToFinal @(H.PropertyT IO)
      & runResource
      & runFinal
      & H.property
      & H.withTests 1

propertyOnce :: ()
  => Sem
        [ Log
        , DataLog (LogEntry LogMessage)
        , DataLog Text
        , GhcTime
        , Hedgehog
        , Embed IO
        , Embed (H.PropertyT IO)
        , Resource
        , Final (H.PropertyT IO)
        ] ()
  -> H.Property
propertyOnce f =
    f & property
      & H.withTests 1