Safe Haskell | None |
---|
- data SubT = forall a . (Arbitrary a, SubTypes a) => SubT {
- unSubT :: a
- subT :: (Arbitrary a, SubTypes a) => a -> SubT
- data Result a
- = FailedPreCond
- | FailedProp
- | Result a
- class (Arbitrary a, Show a, Typeable a) => SubTypes a where
- data Idx = Idx {}
- data Subst
- data Replace a = Replace {}
- errorMsg :: String -> a
- gst :: GST f => f a -> Forest SubT
- grc :: (GST f, Typeable b) => f a -> Forest Subst -> b -> Maybe (f a)
- gtc :: GST f => f a -> String
- gsf :: GST f => f a -> Forest String
- gsz :: GST f => f a -> Int
Documentation
Possible results of iterateArb.
FailedPreCond | Couldn't satisfy the precondition of a QuickCheck property |
FailedProp | Failed the property---either we expect failure and it passes or we expect to pass it and we fail. |
Result a | Satisfied it, with the satisfying value. |
class (Arbitrary a, Show a, Typeable a) => SubTypes a whereSource
This class covers algebraic datatypes that can be transformed into Trees. subTypes is the main method, placing values into trees.
for a datatype with constructors A and C,
subTypes (A (C 0) 1) [Node {rootLabel = C 0, subForest = []}]
subTypes :: a -> Forest SubTSource
replaceChild :: Typeable b => a -> Forest Subst -> b -> Maybe aSource
Generically replace child i in m with value s. A total function: returns Nothing if you try to replace a child with an ill-typed child s. (Returns Just (the original data) if your index is out of bounds).
showForest :: a -> Forest StringSource
showForest generically shows a value while preserving its structure (in a Tree). You should always end up with either a singleton list containing the tree or an empty list for baseTypes. Also, it must be the case that for a value v,
null (subTypes v) iff null (showForest v) and if not . null (subTypes v), then subForest . head (showForest v) has the same structure as subTypes v.
We can't just return a Tree String or Maybe (Tree String). The reason is that in generically constructing the value, we have to deal with product types. There is no sane way to join them other than list-like concatenation (i.e., gsf (a :*: b) = gsf a ++ gsf b).
Index into a Tree/Forest, where level is the depth from the root and column is the distance d is the dth value on the same level. Thus, all left-most nodes are in column 0. This is a matrix view of tree-structured data.
Nominally, a list for value generalization indexes and existential generalization.