{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE OverlappingInstances #-} -- .$Header: c:/Source/Haskell/Wrapper/smallcheck/Data/Flex/Serial/RCS/Wrap.hs,v 1.1 2011/09/21 00:13:15 dosuser Exp dosuser $ -- | Instance selectors and machinery for @'Serial'@ instances for FlexiWrap module Data.Flex.Serial.Wrap ( -- * Instance selectors and machinery for @'Serial'@ instances for FlexiWrap -- ** Instance selectors FWDefaultSerial(..), FWTransparentSerial(..), -- ** Machinery for @'Serial'@ instances FWSerial, FWSeries(..), FWCoseries(..) ) where import Test.SmallCheck (Serial(..), Series) import Data.Type.Apply (Apply(..)) import Data.Type.Eq (TypeCast) import Data.Type.Proxy (Proxy(..)) import Data.Type.TList ((:*:)) import Data.Flex.Serial (WrapCoseries(..), seriesMap) import Data.Flex.Utils (result, argument) import Data.Flex.Wrap (FlexiWrap(..), FW) -- Serial -- | Analysis class for @'Serial'@ instance selection -- You need a specific instance of this for any instance selectors -- you may define. class FWSerial a r | a -> r -- | Instance selector type for the default (transparent) @'Serial'@ -- instances data FWDefaultSerial = FWDefaultSerial deriving (Show, Read) -- | Instance selector type for transparent @'Serial'@ instances data FWTransparentSerial = FWTransparentSerial deriving (Show, Read) -- | Function identifier type for @'Apply'@. -- You need a corresponding instance of @'Apply'@ for any -- instance selectors you may define. data FWSeries t a = FWSeries -- | Function identifier type for @'Apply'@. -- You need a corresponding instance of @'Apply'@ for any -- instance selectors you may define. data FWCoseries t a = FWCoseries -- | * Default instance instance TypeCast r FWTransparentSerial => FWSerial (FW t a) r -- | * Propagated instance instance FWSerial (FW s a) r => FWSerial (FW (x :*: s) a) r -- | * Specific @'FWDefaultSerial'@ instance instance FWSerial (FW (FWDefaultSerial :*: s) a) FWTransparentSerial -- | * Specific @'FWTransparentSerial'@ instance instance FWSerial (FW (FWTransparentSerial :*: s) a) FWTransparentSerial -- | ** Implementation instance for @'Serial'@ instance selection instance Serial a => Apply (Proxy (FWSeries t a)) (Proxy FWTransparentSerial) (Series (FW t a)) where apply _ _ = seriesMap FlexiWrap series -- | ** Implementation instance for @'Serial'@ instance selection instance Serial a => Apply (Proxy (FWCoseries t a)) (Proxy FWTransparentSerial) (WrapCoseries (FW t a)) where apply _ _ = WrapCoseries ((result . seriesMap . argument) unFlexiWrap coseries) -- | * Coordinating instance of @'Serial'@ instance forall t a r. ( Apply (Proxy (FWSeries t a)) (Proxy r) (Series (FW t a)), Apply (Proxy (FWCoseries t a)) (Proxy r) (WrapCoseries (FW t a)), FWSerial (FW t a) r ) => Serial (FW t a) where series = apply (Proxy :: Proxy (FWSeries t a)) (Proxy :: Proxy r) coseries = unwrapCoseries $ apply (Proxy :: Proxy (FWCoseries t a)) (Proxy :: Proxy r) -- vim: expandtab:tabstop=4:shiftwidth=4