module Effectful.Zoo.Hedgehog.Api.Eval
  ( eval,
    evalIO,
    evalM,

    evalEither,
    evalMaybe,
  ) where

import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Zoo.Core
import Effectful.Zoo.Hedgehog.Dynamic
import HaskellWorks.Prelude
import Hedgehog qualified as H

eval :: forall a r. ()
  => HasCallStack
  => r <: Hedgehog
  => a
  -> Eff r a
eval :: forall a (r :: [Effect]).
(HasCallStack, r <: Hedgehog) =>
a -> Eff r a
eval a
a =
  (HasCallStack => Eff r a) -> Eff r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
    a -> Eff r a
forall (m :: * -> *) a. (MonadTest m, HasCallStack) => a -> m a
H.eval a
a

-- |Embeds 'Hedgehog.evalEither'.
evalEither :: forall a e r. ()
  => HasCallStack
  => r <: Hedgehog
  => Show e
  => Either e a
  -> Eff r a
evalEither :: forall a e (r :: [Effect]).
(HasCallStack, r <: Hedgehog, Show e) =>
Either e a -> Eff r a
evalEither Either e a
e =
  (HasCallStack => Eff r a) -> Eff r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
    Either e a -> Eff r a
forall (m :: * -> *) x a.
(MonadTest m, Show x, HasCallStack) =>
Either x a -> m a
H.evalEither Either e a
e

-- |Embeds 'Hedgehog.evalMaybe'.
evalMaybe :: forall a r. ()
  => HasCallStack
  => r <: Hedgehog
  => Maybe a
  -> Eff r a
evalMaybe :: forall a (r :: [Effect]).
(HasCallStack, r <: Hedgehog) =>
Maybe a -> Eff r a
evalMaybe Maybe a
e =
  (HasCallStack => Eff r a) -> Eff r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
    Maybe a -> Eff r a
forall (m :: * -> *) a.
(MonadTest m, HasCallStack) =>
Maybe a -> m a
H.evalMaybe Maybe a
e

evalIO :: forall a r. ()
  => HasCallStack
  => r <: IOE
  => r <: Hedgehog
  => IO a
  -> Eff r a
evalIO :: forall a (r :: [Effect]).
(HasCallStack, r <: IOE, r <: Hedgehog) =>
IO a -> Eff r a
evalIO IO a
f =
  (HasCallStack => Eff r a) -> Eff r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
    IO a -> Eff r a
forall (m :: * -> *) a.
(MonadTest m, MonadIO m, HasCallStack) =>
IO a -> m a
H.evalIO IO a
f

evalM :: forall a r. ()
  => HasCallStack
  => r <: Hedgehog
  => Eff r a
  -> Eff r a
evalM :: forall a (r :: [Effect]).
(HasCallStack, r <: Hedgehog) =>
Eff r a -> Eff r a
evalM Eff r a
f =
  (HasCallStack => Eff r a) -> Eff r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
    Eff r a -> Eff r a
forall (m :: * -> *) a.
(MonadTest m, MonadCatch m, HasCallStack) =>
m a -> m a
H.evalM Eff r a
f