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

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

hither
  :: (Eq s, Show s, Eq a, Show a, Serial m a)
  => Iso' s a -> Series m s -> Property m
hither l ss = SC.over ss $ \s ->
    s ^. l . from l == s

yon
  :: (Eq s, Show s, Eq a, Show a, Serial m a)
  => Iso' s a -> Series m a -> Property m
yon l as = SC.over as $ \a -> a ^. from l . l == a