testing-feat-0.2: 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) as long as the instance does
-- not override the default definition of 'shared' so it does not use
-- 'tagShare' (no instance in the library does this).This function should not
-- be used for defining instances (doing so might increase memory usage).
override :: Enumerable a => Override -> Enumerate a
override = evalState (optimal shared)