Copyright | (c) 2011-2015 diagrams-core team (see LICENSE) |
---|---|
License | BSD-style (see LICENSE) |
Maintainer | diagrams-discuss@googlegroups.com |
Safe Haskell | None |
Language | Haskell2010 |
A definition of styles for diagrams as extensible, heterogeneous collections of attributes.
- class (Typeable a, Semigroup a) => AttributeClass a
- data Attribute v n :: * where
- Attribute :: AttributeClass a => a -> Attribute v n
- MAttribute :: AttributeClass a => Measured n a -> Attribute v n
- TAttribute :: (AttributeClass a, Transformable a, V a ~ v, N a ~ n) => a -> Attribute v n
- _Attribute :: AttributeClass a => Prism' (Attribute v n) a
- _MAttribute :: (AttributeClass a, Typeable n) => Prism' (Attribute v n) (Measured n a)
- _TAttribute :: (V a ~ v, N a ~ n, AttributeClass a, Transformable a) => Prism' (Attribute v n) a
- unwrapAttribute :: AttributeClass a => Attribute v n -> Maybe a
- unmeasureAttribute :: Num n => n -> n -> Attribute v n -> Attribute v n
- attributeType :: Attribute v n -> TypeRep
- newtype Style v n = Style (HashMap TypeRep (Attribute v n))
- attributeToStyle :: Attribute v n -> Style v n
- getAttr :: forall a v n. AttributeClass a => Style v n -> Maybe a
- unmeasureAttrs :: Num n => n -> n -> Style v n -> Style v n
- atAttr :: AttributeClass a => Lens' (Style v n) (Maybe a)
- atMAttr :: (AttributeClass a, Typeable n) => Lens' (Style v n) (Maybe (Measured n a))
- atTAttr :: (V a ~ v, N a ~ n, AttributeClass a, Transformable a) => Lens' (Style v n) (Maybe a)
- applyAttr :: (AttributeClass a, HasStyle d) => a -> d -> d
- applyMAttr :: (AttributeClass a, N d ~ n, HasStyle d) => Measured n a -> d -> d
- applyTAttr :: (AttributeClass a, Transformable a, V a ~ V d, N a ~ N d, HasStyle d) => a -> d -> d
- class HasStyle a where
Attributes
An attribute is anything that determines some aspect of a diagram's rendering. The standard diagrams library defines several standard attributes (line color, line width, fill color, etc.) but additional attributes may easily be created. Additionally, a given backend need not handle (or even know about) attributes used in diagrams it renders.
The attribute code is inspired by xmonad's Message
type, which
was in turn based on ideas in:
Simon Marlow. An Extensible Dynamically-Typed Hierarchy of Exceptions. Proceedings of the 2006 ACM SIGPLAN workshop on Haskell. http://research.microsoft.com/apps/pubs/default.aspx?id=67968.
class (Typeable a, Semigroup a) => AttributeClass a #
data Attribute v n :: * where #
An existential wrapper type to hold attributes. Some attributes are simply inert/static; some are affected by transformations; and some are affected by transformations and can be modified generically.
Attribute :: AttributeClass a => a -> Attribute v n | |
MAttribute :: AttributeClass a => Measured n a -> Attribute v n | |
TAttribute :: (AttributeClass a, Transformable a, V a ~ v, N a ~ n) => a -> Attribute v n |
Show (Attribute v n) # | Shows the kind of attribute and the type contained in the attribute. |
Typeable * n => Semigroup (Attribute v n) # | Attributes form a semigroup, where the semigroup operation simply returns the right-hand attribute when the types do not match, and otherwise uses the semigroup operation specific to the (matching) types. |
(Additive v, Traversable v, Floating n) => Transformable (Attribute v n) # |
|
Each (Style v n) (Style v' n') (Attribute v n) (Attribute v' n') # | |
type N (Attribute v n) # | |
type V (Attribute v n) # | |
Attributes prisms
_Attribute :: AttributeClass a => Prism' (Attribute v n) a #
Prism onto an Attribute
.
_MAttribute :: (AttributeClass a, Typeable n) => Prism' (Attribute v n) (Measured n a) #
Prism onto an MAttribute
.
_TAttribute :: (V a ~ v, N a ~ n, AttributeClass a, Transformable a) => Prism' (Attribute v n) a #
Prism onto a TAttribute
.
Attributes utilities
unwrapAttribute :: AttributeClass a => Attribute v n -> Maybe a #
Unwrap an unknown Attribute
type, performing a dynamic (but
safe) check on the type of the result. If the required type
matches the type of the attribute, the attribute value is
returned wrapped in Just
; if the types do not match, Nothing
is returned.
Measured attributes cannot be extrated from this function until
they have been unmeasured with unmeasureAttribute
. If you want a
measured attibute use the _MAttribute
prism.
unmeasureAttribute :: Num n => n -> n -> Attribute v n -> Attribute v n #
Turn an MAttribute
into an Attribute
using the given global
and normalized
scale.
attributeType :: Attribute v n -> TypeRep #
Type of an attribute that is stored with a style. Measured attributes return the type as if it where unmeasured.
Styles
A Style
is a heterogeneous collection of attributes, containing
at most one attribute of any given type. This is also based on
ideas stolen from xmonad, specifically xmonad's implementation of
user-extensible state.
A Style
is a heterogeneous collection of attributes, containing
at most one attribute of any given type.
Show (Style v n) # | Show the attributes in the style. |
Typeable * n => Semigroup (Style v n) # | Combine a style by combining the attributes; if the two styles have attributes of the same type they are combined according to their semigroup structure. |
Typeable * n => Monoid (Style v n) # | The empty style contains no attributes. |
Ixed (Style v n) # | |
At (Style v n) # | |
Wrapped (Style v n) # | |
(Additive v, Traversable v, Floating n) => Transformable (Style v n) # | |
Typeable * n => HasStyle (Style v n) # | |
Action (Style v n) m # | Styles have no action on other monoids. |
Rewrapped (Style v n) (Style v' n') # | |
Each (Style v n) (Style v' n') (Attribute v n) (Attribute v' n') # | |
type Index (Style v n) # | |
type IxValue (Style v n) # | |
type Unwrapped (Style v n) # | |
type N (Style v n) # | |
type V (Style v n) # | |
Making styles
attributeToStyle :: Attribute v n -> Style v n #
Turn an attribute into a style. An easier way to make a style is to use the monoid instance and apply library functions for applying that attribute:
myStyle = mempty # fc blue :: Style V2 Double
Extracting attibutes from styles
getAttr :: forall a v n. AttributeClass a => Style v n -> Maybe a #
Extract an attribute from a style of a particular type. If the
style contains an attribute of the requested type, it will be
returned wrapped in Just
; otherwise, Nothing
is returned.
Trying to extract a measured attibute will fail. It either has to
be unmeasured with unmeasureAttrs
or use the atMAttr
lens.
unmeasureAttrs :: Num n => n -> n -> Style v n -> Style v n #
Replace all MAttribute
s with Attribute
s using the global
and
normalized
scales.
Attibute lenses
atMAttr :: (AttributeClass a, Typeable n) => Lens' (Style v n) (Maybe (Measured n a)) #
Lens onto a measured attribute of a style.
atTAttr :: (V a ~ v, N a ~ n, AttributeClass a, Transformable a) => Lens' (Style v n) (Maybe a) #
Lens onto a transformable attribute of a style.
Applying styles
applyAttr :: (AttributeClass a, HasStyle d) => a -> d -> d #
Apply an attribute to an instance of HasStyle
(such as a
diagram or a style). If the object already has an attribute of
the same type, the new attribute is combined on the left with the
existing attribute, according to their semigroup structure.
applyMAttr :: (AttributeClass a, N d ~ n, HasStyle d) => Measured n a -> d -> d #
Apply a measured attribute to an instance of HasStyle
(such as a
diagram or a style). If the object already has an attribute of
the same type, the new attribute is combined on the left with the
existing attribute, according to their semigroup structure.
applyTAttr :: (AttributeClass a, Transformable a, V a ~ V d, N a ~ N d, HasStyle d) => a -> d -> d #
Apply a transformable attribute to an instance of HasStyle
(such as a diagram or a style). If the object already has an
attribute of the same type, the new attribute is combined on the
left with the existing attribute, according to their semigroup
structure.
Type class for things which have a style.
applyStyle :: Style (V a) (N a) -> a -> a #
Apply a style by combining it (on the left) with the existing style.
HasStyle a => HasStyle [a] # | |
(HasStyle a, Ord a) => HasStyle (Set a) # | |
HasStyle b => HasStyle (a -> b) # | |
(HasStyle a, HasStyle b, (~) (* -> *) (V a) (V b), (~) * (N a) (N b)) => HasStyle (a, b) # | |
HasStyle a => HasStyle (Map k a) # | |
HasStyle b => HasStyle (Measured n b) # | |
Typeable * n => HasStyle (Style v n) # | |
(Metric v, OrderedField n, Semigroup m) => HasStyle (QDiagram b v n m) # | |