Copyright | (c) 2013 diagrams-lib team (see LICENSE) |
---|---|
License | BSD-style (see LICENSE) |
Maintainer | diagrams-discuss@googlegroups.com |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Names can be given to subdiagrams, and subdiagrams can later be queried by name. This module exports types for representing names and subdiagrams, and various functions for working with them.
Synopsis
- data AName
- data Name
- class (Typeable a, Ord a, Show a) => IsName a where
- (.>) :: (IsName a1, IsName a2) => a1 -> a2 -> Name
- class Qualifiable q where
- data Subdiagram b (v :: Type -> Type) n m
- mkSubdiagram :: forall b (v :: Type -> Type) n m. QDiagram b v n m -> Subdiagram b v n m
- subPoint :: forall (v :: Type -> Type) n b m. (Metric v, OrderedField n) => Point v n -> Subdiagram b v n m
- getSub :: forall (v :: Type -> Type) n m b. (Metric v, OrderedField n, Semigroup m) => Subdiagram b v n m -> QDiagram b v n m
- rawSub :: forall b (v :: Type -> Type) n m. Subdiagram b v n m -> QDiagram b v n m
- location :: forall (v :: Type -> Type) n b m. (Additive v, Num n) => Subdiagram b v n m -> Point v n
- data SubMap b (v :: Type -> Type) n m
- fromNames :: forall a b (v :: Type -> Type) n m. IsName a => [(a, Subdiagram b v n m)] -> SubMap b v n m
- rememberAs :: forall a b (v :: Type -> Type) n m. IsName a => a -> QDiagram b v n m -> SubMap b v n m -> SubMap b v n m
- lookupSub :: forall nm b (v :: Type -> Type) n m. IsName nm => nm -> SubMap b v n m -> Maybe [Subdiagram b v n m]
- named :: (IsName nm, Metric v, OrderedField n, Semigroup m) => nm -> QDiagram b v n m -> QDiagram b v n m
- nameSub :: forall nm (v :: Type -> Type) n m b. (IsName nm, Metric v, OrderedField n, Semigroup m) => (QDiagram b v n m -> Subdiagram b v n m) -> nm -> QDiagram b v n m -> QDiagram b v n m
- namePoint :: (IsName nm, Metric v, OrderedField n, Semigroup m) => (QDiagram b v n m -> Point v n) -> nm -> QDiagram b v n m -> QDiagram b v n m
- localize :: forall b (v :: Type -> Type) n m. (Metric v, OrderedField n, Semigroup m) => QDiagram b v n m -> QDiagram b v n m
- names :: forall (v :: Type -> Type) m n b. (Metric v, Semigroup m, OrderedField n) => QDiagram b v n m -> [(Name, [Point v n])]
- lookupName :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => nm -> QDiagram b v n m -> Maybe (Subdiagram b v n m)
- withName :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => nm -> (Subdiagram b v n m -> QDiagram b v n m -> QDiagram b v n m) -> QDiagram b v n m -> QDiagram b v n m
- withNameAll :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => nm -> ([Subdiagram b v n m] -> QDiagram b v n m -> QDiagram b v n m) -> QDiagram b v n m -> QDiagram b v n m
- withNames :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => [nm] -> ([Subdiagram b v n m] -> QDiagram b v n m -> QDiagram b v n m) -> QDiagram b v n m -> QDiagram b v n m
Names
A (qualified) name is a (possibly empty) sequence of atomic names.
Instances
Monoid Name | |
Semigroup Name | |
Show Name | |
IsName Name | |
Defined in Diagrams.Core.Names | |
Qualifiable Name | Of course, names can be qualified using |
Eq Name | |
Ord Name | |
Wrapped Name | |
Rewrapped Name Name | |
Defined in Diagrams.Core.Names | |
Each Name Name AName AName | |
Action Name (SubMap b v n m) | A name acts on a name map by qualifying every name in it. |
type Unwrapped Name | |
Defined in Diagrams.Core.Names |
class (Typeable a, Ord a, Show a) => IsName a where #
Class for those types which can be used as names. They must
support Typeable
(to facilitate extracting them from
existential wrappers), Ord
(for comparison and efficient
storage) and Show
.
To make an instance of IsName
, you need not define any methods,
just declare it.
WARNING: it is not recommended to use
GeneralizedNewtypeDeriving
in conjunction with IsName
, since
in that case the underlying type and the newtype
will be
considered equivalent when comparing names. For example:
newtype WordN = WordN Int deriving (Show, Ord, Eq, Typeable, IsName)
is unlikely to work as intended, since (1 :: Int)
and (WordN 1)
will be considered equal as names. Instead, use
newtype WordN = WordN Int deriving (Show, Ord, Eq, Typeable, IsName) instance IsName WordN
Nothing
Instances
IsName AName | |
Defined in Diagrams.Core.Names | |
IsName Name | |
Defined in Diagrams.Core.Names | |
IsName Integer | |
Defined in Diagrams.Core.Names | |
IsName () | |
Defined in Diagrams.Core.Names | |
IsName Bool | |
Defined in Diagrams.Core.Names | |
IsName Char | |
Defined in Diagrams.Core.Names | |
IsName Double | |
Defined in Diagrams.Core.Names | |
IsName Float | |
Defined in Diagrams.Core.Names | |
IsName Int | |
Defined in Diagrams.Core.Names | |
IsName a => IsName (Maybe a) | |
Defined in Diagrams.Core.Names | |
IsName a => IsName [a] | |
Defined in Diagrams.Core.Names | |
(IsName a, IsName b) => IsName (a, b) | |
Defined in Diagrams.Core.Names | |
(IsName a, IsName b, IsName c) => IsName (a, b, c) | |
Defined in Diagrams.Core.Names |
(.>) :: (IsName a1, IsName a2) => a1 -> a2 -> Name infixr 5 #
Convenient operator for writing qualified names with atomic
components of different types. Instead of writing toName a1 <>
toName a2 <> toName a3
you can just write a1 .> a2 .> a3
.
class Qualifiable q where #
Instances of Qualifiable
are things which can be qualified by
prefixing them with a name.
Instances
Qualifiable Name | Of course, names can be qualified using |
(Ord a, Qualifiable a) => Qualifiable (Set a) | |
Qualifiable a => Qualifiable (TransInv a) | |
Qualifiable a => Qualifiable (Located a) Source # | |
Qualifiable a => Qualifiable [a] | |
Defined in Diagrams.Core.Names | |
Qualifiable a => Qualifiable (Map k a) | |
Qualifiable a => Qualifiable (Measured n a) | |
Qualifiable a => Qualifiable (b -> a) | |
Defined in Diagrams.Core.Names | |
(Qualifiable a, Qualifiable b) => Qualifiable (a, b) | |
Defined in Diagrams.Core.Names | |
(Qualifiable a, Qualifiable b, Qualifiable c) => Qualifiable (a, b, c) | |
Defined in Diagrams.Core.Names | |
(Metric v, OrderedField n, Semigroup m) => Qualifiable (QDiagram b v n m) | Diagrams can be qualified so that all their named points can now be referred to using the qualification prefix. |
Qualifiable (SubMap b v n m) |
|
Subdiagrams
data Subdiagram b (v :: Type -> Type) n m #
A Subdiagram
represents a diagram embedded within the context
of a larger diagram. Essentially, it consists of a diagram
paired with any accumulated information from the larger context
(transformations, attributes, etc.).
Instances
mkSubdiagram :: forall b (v :: Type -> Type) n m. QDiagram b v n m -> Subdiagram b v n m #
Turn a diagram into a subdiagram with no accumulated context.
subPoint :: forall (v :: Type -> Type) n b m. (Metric v, OrderedField n) => Point v n -> Subdiagram b v n m #
Create a "point subdiagram", that is, a pointDiagram
(with no
content and a point envelope) treated as a subdiagram with local
origin at the given point. Note this is not the same as
mkSubdiagram . pointDiagram
, which would result in a subdiagram
with local origin at the parent origin, rather than at the given
point.
getSub :: forall (v :: Type -> Type) n m b. (Metric v, OrderedField n, Semigroup m) => Subdiagram b v n m -> QDiagram b v n m #
Turn a subdiagram into a normal diagram, including the enclosing
context. Concretely, a subdiagram is a pair of (1) a diagram and
(2) a "context" consisting of an extra transformation and
attributes. getSub
simply applies the transformation and
attributes to the diagram to get the corresponding "top-level"
diagram.
rawSub :: forall b (v :: Type -> Type) n m. Subdiagram b v n m -> QDiagram b v n m #
Extract the "raw" content of a subdiagram, by throwing away the context.
location :: forall (v :: Type -> Type) n b m. (Additive v, Num n) => Subdiagram b v n m -> Point v n #
Get the location of a subdiagram; that is, the location of its local origin with respect to the vector space of its parent diagram. In other words, the point where its local origin "ended up".
Subdiagram maps
data SubMap b (v :: Type -> Type) n m #
A SubMap
is a map associating names to subdiagrams. There can
be multiple associations for any given name.
Instances
Action Name (SubMap b v n m) | A name acts on a name map by qualifying every name in it. |
Functor (SubMap b v n) | |
Monoid (SubMap b v n m) |
|
Semigroup (SubMap b v n m) | |
(OrderedField n, Metric v) => HasOrigin (SubMap b v n m) | |
Defined in Diagrams.Core.Types | |
Qualifiable (SubMap b v n m) |
|
Transformable (SubMap b v n m) | |
Defined in Diagrams.Core.Types | |
Wrapped (SubMap b v n m) | |
Rewrapped (SubMap b v n m) (SubMap b' v' n' m') | |
Defined in Diagrams.Core.Types | |
type N (SubMap b v n m) | |
Defined in Diagrams.Core.Types | |
type V (SubMap b v n m) | |
Defined in Diagrams.Core.Types | |
type Unwrapped (SubMap b v n m) | |
Defined in Diagrams.Core.Types |
fromNames :: forall a b (v :: Type -> Type) n m. IsName a => [(a, Subdiagram b v n m)] -> SubMap b v n m #
Construct a SubMap
from a list of associations between names
and subdiagrams.
rememberAs :: forall a b (v :: Type -> Type) n m. IsName a => a -> QDiagram b v n m -> SubMap b v n m -> SubMap b v n m #
Add a name/diagram association to a submap.
lookupSub :: forall nm b (v :: Type -> Type) n m. IsName nm => nm -> SubMap b v n m -> Maybe [Subdiagram b v n m] #
Look for the given name in a name map, returning a list of subdiagrams associated with that name. If no names match the given name exactly, return all the subdiagrams associated with names of which the given name is a suffix.
Naming things
named :: (IsName nm, Metric v, OrderedField n, Semigroup m) => nm -> QDiagram b v n m -> QDiagram b v n m Source #
Attach an atomic name to a diagram.
nameSub :: forall nm (v :: Type -> Type) n m b. (IsName nm, Metric v, OrderedField n, Semigroup m) => (QDiagram b v n m -> Subdiagram b v n m) -> nm -> QDiagram b v n m -> QDiagram b v n m #
Attach an atomic name to a certain subdiagram, computed from the
given diagram /with the mapping from name to subdiagram
included/. The upshot of this knot-tying is that if d' = d #
named x
, then lookupName x d' == Just d'
(instead of Just
d
).
namePoint :: (IsName nm, Metric v, OrderedField n, Semigroup m) => (QDiagram b v n m -> Point v n) -> nm -> QDiagram b v n m -> QDiagram b v n m Source #
Attach an atomic name to a certain point (which may be computed from the given diagram), treated as a subdiagram with no content and a point envelope.
localize :: forall b (v :: Type -> Type) n m. (Metric v, OrderedField n, Semigroup m) => QDiagram b v n m -> QDiagram b v n m #
"Localize" a diagram by hiding all the names, so they are no longer visible to the outside.
Querying by name
names :: forall (v :: Type -> Type) m n b. (Metric v, Semigroup m, OrderedField n) => QDiagram b v n m -> [(Name, [Point v n])] #
Get a list of names of subdiagrams and their locations.
lookupName :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => nm -> QDiagram b v n m -> Maybe (Subdiagram b v n m) #
Lookup the most recent diagram associated with (some qualification of) the given name.
withName :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => nm -> (Subdiagram b v n m -> QDiagram b v n m -> QDiagram b v n m) -> QDiagram b v n m -> QDiagram b v n m #
Given a name and a diagram transformation indexed by a subdiagram, perform the transformation using the most recent subdiagram associated with (some qualification of) the name, or perform the identity transformation if the name does not exist.
withNameAll :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => nm -> ([Subdiagram b v n m] -> QDiagram b v n m -> QDiagram b v n m) -> QDiagram b v n m -> QDiagram b v n m #
Given a name and a diagram transformation indexed by a list of subdiagrams, perform the transformation using the collection of all such subdiagrams associated with (some qualification of) the given name.
withNames :: forall nm (v :: Type -> Type) m n b. (IsName nm, Metric v, Semigroup m, OrderedField n) => [nm] -> ([Subdiagram b v n m] -> QDiagram b v n m -> QDiagram b v n m) -> QDiagram b v n m -> QDiagram b v n m #
Given a list of names and a diagram transformation indexed by a list of subdiagrams, perform the transformation using the list of most recent subdiagrams associated with (some qualification of) each name. Do nothing (the identity transformation) if any of the names do not exist.