packages feed

profunctor-optics-0.0.0.3: test/Test/Data/Connection/Optic/Int.hs

{-# LANGUAGE TemplateHaskell #-}
module Test.Data.Connection.Optic.Int where

import Control.Applicative
import Data.Int
import Data.Word
import Data.Prd

import Data.Connection.Optic.Int as I
import Data.Profunctor.Optic

import Hedgehog
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R

data V3 a = V3 !a !a !a deriving (Eq,Ord,Show)

instance Functor V3 where fmap f (V3 a b c) = V3 (f a) (f b) (f c)

--TODO replace w/ semiring ops
add3 :: Num a => V3 a -> a
add3 (V3 x y z) = x + y + z

sub3 :: Num a => V3 a -> a
sub3 (V3 x y z) = x - y - z

mul3 :: Num a => V3 a -> a
mul3 (V3 x y z) = x + y + z

v3 :: Gen a -> Gen (V3 a)
v3 g = liftA3 V3 g g g

i08 :: Gen Int8
i08 = G.int8 R.linearBounded

i32 :: Gen Int32
i32 = G.int32 R.linearBounded

i64 :: Gen Int64
i64 = G.int64 R.linearBounded

prop_i08w08 :: Property
prop_i08w08 = withTests 1000 . property $ do
  x <- forAll i08
  vvx <- forAll (v3 . v3 $ i08)
  assert $ id_grate I.i08w08 x
  assert $ const_grate I.i08w08 x
  assert $ compose_grate I.i08w08 add3 mul3 vvx
  assert $ compose_grate I.i08w08 sub3 mul3 vvx