module Generics.Putlenses.QuickCheck where
import Test.QuickCheck
import Generics.Putlenses.Putlens
wb :: (Eq s,Eq v) => Lens s v -> s -> v -> Property
wb l s v = putgetPartial (\s v -> True) l s v .&&. getputPartial (\s -> True) l s
wbPartial :: (Eq s,Eq v) => (s -> Bool) -> (s -> v -> Bool) -> Lens s v -> s -> v -> Property
wbPartial getDom putDom l s v = putgetPartial putDom l s v .&&. getputPartial getDom l s
putgetPartial :: Eq v => (s -> v -> Bool) -> Lens s v -> s -> v -> Property
putgetPartial putDom l s v = putDom s v ==> get l (put l s v) == v
getputPartial :: Eq s => (s -> Bool) -> Lens s v -> s -> Property
getputPartial getDom l s = getDom s ==> put l s (get l s) == s