testing-feat-0.3: Test/Feat/Class/Override.hs
-- | Anexperimental feature to override the 'Enumerable' instance for any type.
module Test.Feat.Class.Override (
Override,
noOverride,
addOverride,
override
) where
import Test.Feat.Enumerate
import Test.Feat.Class
import Test.Feat.Internals.Tag(Tag(Class))
import Test.Feat.Modifiers
import Control.Monad.TagShare
import Control.Monad.State
type Override = DynMap Tag
noOverride :: Override
noOverride = dynEmpty
addOverride :: Enumerable a => Enumerate a -> Override -> Override
addOverride = dynInsert Class
-- | This function is best described with an example:
--
-- @
-- let e1 = override $ addOverride (unary 'printable') noOverride :: Enumerate T
-- @
--
-- @e1@ enumerates values of type @T@ where all characters (accessed using
-- the @Enumerable@ instance for @Char@) are printable. Sometimes this can save
-- you from placing lots of 'printable' modifiers in your instances or
-- newtypes in your data type definitions.
--
-- This works for any type (not just characters). This function should typically
-- not be used when combining enumerations (doing so might increase memory
-- usage because the resulting enumeration is optimised).
-- Also this only has effect on enumerations which have not already been
-- optimised, so using override again on the result of override has no effect.
override :: Enumerable a => Override -> Enumerate a
override = evalState (optimiser shared)