{-# LANGUAGE RankNTypes #-}
-- | This module is intended to be imported @qualified@, for example:
--
-- > import qualified Test.SmallCheck.Lens.Lens as Lens
--
module Test.SmallCheck.Lens.Lens where

import Control.Lens
import Test.SmallCheck (Property)
import qualified Test.SmallCheck as SC (over)
import Test.SmallCheck.Series (Series)

setView :: (Monad m, Eq s, Show s) => Lens' s a -> Series m s -> Property m
setView l ss = SC.over ss $ \s -> set l (view l s) s == s

viewSet
  :: (Monad m, Eq s, Eq a, Show s, Show a)
  => Lens' s a -> Series m s -> Series m a -> Property m
viewSet l ss as = SC.over ss $ \s -> SC.over as $ \a ->
    view l (set l a s) == a