Safe Haskell | None |
---|---|
Language | Haskell98 |
This module captures annotations on a value, and builds a Capture
value.
This module has two ways of writing annotations:
Impure: The impure method of writing annotations is susceptible to over-optimisation by GHC
- sometimes {-# OPTIONS_GHC -fno-cse #-}
will be required.
Pure: The pure method is more verbose, and lacks some type safety.
As an example of the two styles:
data Foo = Foo {foo :: Int, bar :: Int}
impure =capture
$ Foo {foo = 12, bar =many
[1&=
"inner", 2]}&=
"top"
pure =capture_
$record
Foo{} [foo := 12, bar :=+ [atom
1+=
"inner",atom
2]]+=
"top"
Both evaluate to:
Capture (Ann "top") (Ctor (Foo 12 1) [Value 12, Many [Ann "inner" (Value 1), Value 2]]
- data Capture ann
- data Any = forall a . Data a => Any a
- fromCapture :: Capture ann -> Any
- defaultMissing :: Capture ann -> Capture ann
- capture :: (Data val, Data ann) => val -> Capture ann
- many :: Data val => [val] -> val
- (&=) :: (Data val, Data ann) => val -> ann -> val
- capture_ :: Show a => Annotate a -> Capture a
- many_ :: [Annotate a] -> Annotate a
- (+=) :: Annotate ann -> ann -> Annotate ann
- atom :: Data val => val -> Annotate ann
- record :: Data a => a -> [Annotate ann] -> Annotate ann
- data Annotate ann
Capture framework
The result of capturing some annotations.
fromCapture :: Capture ann -> Any Source
Return the value inside a capture.
defaultMissing :: Capture ann -> Capture ann Source
Remove all Missing values by using any previous instances as default values
Impure
capture :: (Data val, Data ann) => val -> Capture ann Source
Capture a value. Note that if the value is evaluated more than once the result may be different, i.e.
capture x /= capture x
(&=) :: (Data val, Data ann) => val -> ann -> val infixl 2 Source
Add an annotation to a value.
It is recommended that anyone making use of this function redefine it with a more restrictive type signature to control the type of the annotation (the second argument). Any redefinitions of this function should add an INLINE pragma, to reduce the chance of incorrect optimisations.
Pure
capture_ :: Show a => Annotate a -> Capture a Source
Capture the annotations from an annotated value.
record :: Data a => a -> [Annotate ann] -> Annotate ann Source
Create a constructor/record. The first argument should be
the type of field, the second should be a list of fields constructed
originally defined by :=
or :=+
.
This operation is not type safe, and may raise an exception at runtime if any field has the wrong type or label.