packages feed

flexiwrap-0.0.1: Data/Flex/SmallCheck/Wrap.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
-- $Header: c:/Source/Haskell/Wrapper/Data/Flex/SmallCheck/RCS/Wrap.hs,v 1.2 2010/03/13 00:11:09 dosuser Exp dosuser $
module Data.Flex.SmallCheck.Wrap where

import Test.SmallCheck

{-
import Control.Applicative ((<$>))

import Data.Wrap (result, argument)
-}

import Data.Type.Apply (Apply(..))
import Data.Type.Eq (TypeCast)
import Data.Type.TList ((:*:), TNil)

import Data.Flex.Wrap

{-
import Data.Flex.SmallCheck.Instances
-}

data X = X

prop_default_Eq_is_Eq x y = (x == y) == (w x == w y) where
    w = fWrap X :: Bool -> FW (X :*: TNil) Bool
    types = x :: Bool

data FWEqFirst = FWEqFirst

instance TypeCast r FWEqFirst => FWEq (FW (FWEqFirst :*: s) a) r

instance Eq a =>
    Apply (FWEquals t (a, b)) FWEqFirst (FW t (a, b) -> FW t (a, b) -> Bool)
  where
    apply _ _ = (==) `on` fst . unFlexiWrap

instance Eq a =>
    Apply (FWNotEquals t (a, b)) FWEqFirst (FW t (a, b) -> FW t (a, b) -> Bool)
  where
    apply _ _ = (/=) `on` fst `on` unFlexiWrap

prop_EqFirst_is_Eq_fst x y = (x `eqFst` y) == (w x == w y) where
    eqFst = (==) `on` fst
    w = FlexiWrap :: (Bool, Bool) -> FW (FWEqFirst :*: TNil) (Bool, Bool)

-- vim: expandtab:tabstop=4:shiftwidth=4