{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE ScopedTypeVariables #-} import Control.Monad.State (execState) import Data.Optics.Operators ((*=), (+=), (-=), (//=)) import GHC.Generics (Generic) import Test.Tasty (defaultMain, testGroup) import Test.Tasty.QuickCheck (testProperty) newtype Foo = Foo {bar :: Float} deriving ( Floating , Fractional , Ord , Num , Real , RealFrac , RealFloat , Eq , Generic ) -- (+=) :: (Is k A_Setter, MonadState s m, Num a) => Optic' k is s a -> a -> m () main :: IO () main = defaultMain $ testGroup "Data.Optic.Operators" testTree where -- A test case for simple operators e.g. +=, -=, etc. testBasic name f g = testProperty name $ \(x :: Float, y :: Float) -> let a = Foo (x `f` y) b = execState (#bar `g` y) (Foo x) in a == b || isNaN a && isNaN b testTree = [ testBasic "(+=)" (+) (+=) , testBasic "(-=)" (-) (-=) , testBasic "(*=)" (*) (*=) , testBasic "(//=)" (/) (//=) ]