{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Test.Monad.Cont.Checkers where
import Control.Monad.Cont
import Control.Monad.State
import Test.QuickCheck (Gen, Property)
import Test.QuickCheck.HigherOrder (CoArbitrary, Constructible, TestEq, ok)
import Test.Monad.Instances ()
import Test.Monad.Cont
checkCont ::
forall m a b.
( MonadCont m
, TestEq (m a)
, CoArbitrary Gen b, CoArbitrary Gen (m b)
, Constructible a, Constructible (m a), Constructible (m b)
) =>
[(String, Property)]
checkCont =
[ ok "callCC-const" (callCC_const @m @a)
, ok "callCC-id" (callCC_id @m @a)
, ok "callCC-bind" (callCC_bind @m @a)
, ok "callCC-phantom" (callCC_phantom @m @a @b)
, ok "callCC-left-zero" (callCC_left_zero @m @a @b)
]
{-# NOINLINE checkCont #-}
checkCont_ :: [(String, Property)]
checkCont_ =
checkCont @(Cont Int) @Int @Int
++ checkCont @(ContT Int (State Int)) @Int @Int
++ checkCont @(ContT Int []) @Int @Int
++ checkCont @(ContT Int (StateT Int [])) @Int @Int