packages feed

polysemy-test-0.1.0.0: lib/Polysemy/Test/Data/Hedgehog.hs

{-# OPTIONS_HADDOCK hide #-}

module Polysemy.Test.Data.Hedgehog where

import Hedgehog (TestT)

import Polysemy (makeSem_)

-- |Convenience effect for embedding Hedgehog assertions.
data Hedgehog :: Effect where
  LiftH :: TestT IO a -> Hedgehog m a
  Assert :: Bool -> Hedgehog m ()
  AssertEqual :: (Eq a, Show a) => a -> a -> Hedgehog m ()
  EvalEither :: Show e => Either e a -> Hedgehog m a
  AssertRight :: (Show e, Eq a, Show a) => a -> Either e a -> Hedgehog m ()

makeSem_ ''Hedgehog

-- |Lift a @'TestT' IO@ into Sem.
-- >>> liftH (Hedgehog.evalEither (Right 0))
liftH ::
  ∀ a r .
  Member Hedgehog r =>
  TestT IO a ->
  Sem r a

-- |Embeds 'Hedgehog.assert'.
assert ::
  ∀ r .
  Member Hedgehog r =>
  Bool ->
  Sem r ()

-- |Embeds 'Hedgehog.(===)'.
assertEqual ::
  ∀ a r .
  Eq a =>
  Show a =>
  Member Hedgehog r =>
  a ->
  a ->
  Sem r ()

-- |Alias for 'assertEqual'.
-- >>> 5 === 6
(===) ::
  Eq a =>
  Show a =>
  Member Hedgehog r =>
  a ->
  a ->
  Sem r ()
(===) =
  assertEqual

-- |Embeds 'Hedgehog.evalEither'.
evalEither ::
  ∀ a e r .
  Show e =>
  Member Hedgehog r =>
  Either e a ->
  Sem r a

-- |Given a reference value, unpacks an 'Either' with 'evalEither' and applies 'assertEqual' to the result in the
-- 'Right' case, and produces a test failure in the 'Left' case.
assertRight ::
  ∀ a e r .
  Show e =>
  Eq a =>
  Show a =>
  Member Hedgehog r =>
  a ->
  Either e a ->
  Sem r ()

data ValueIsNothing =
  ValueIsNothing
  deriving Show

assertJust ::
  Eq a =>
  Show a =>
  Member Hedgehog r =>
  a ->
  Maybe a ->
  Sem r ()
assertJust target =
  assertRight target . maybeToRight ValueIsNothing

evalMaybe ::
  Member Hedgehog r =>
  Maybe a ->
  Sem r a
evalMaybe =
  evalEither . maybeToRight ValueIsNothing