Copyright | (c) 2011-2015 diagrams-core team (see LICENSE) |
---|---|
License | BSD-style (see LICENSE) |
Maintainer | diagrams-discuss@googlegroups.com |
Safe Haskell | None |
Language | Haskell2010 |
This module defines a type of names which can be used for referring to subdiagrams, and related types.
Names
Atomic names
Names
A (qualified) name is a (possibly empty) sequence of atomic names.
Eq Name # | |
Ord Name # | |
Show Name # | |
Semigroup Name # | |
Monoid Name # | |
Wrapped Name # | |
Qualifiable Name # | Of course, names can be qualified using |
IsName Name # | |
Rewrapped Name Name # | |
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 # | |
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
(.>) :: (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
.
eachName :: (Typeable a, Ord a, Show a) => Traversal' Name a #
Traversal over each name in a Name
that matches the target type.
>>> toListOf eachName (a
.> False .>b
) :: String "ab" >>>a
.> True .>b
& eachName %~ nota
.> False .>b
Note that the type of the name is very important.
>>> sumOf eachName ((1::Int) .> (2 :: Integer) .> (3 :: Int)) :: Int 4 >>> sumOf eachName ((1::Int) .> (2 :: Integer) .> (3 :: Int)) :: Integer 2
Qualifiable
class Qualifiable q where #
Instances of Qualifiable
are things which can be qualified by
prefixing them with a name.
Qualifiable Name # | Of course, names can be qualified using |
Qualifiable a => Qualifiable [a] # | |
(Ord a, Qualifiable a) => Qualifiable (Set a) # | |
Qualifiable a => Qualifiable (TransInv a) # | |
Qualifiable a => Qualifiable (b -> a) # | |
(Qualifiable a, Qualifiable b) => Qualifiable (a, b) # | |
Qualifiable a => Qualifiable (Map k a) # | |
Qualifiable a => Qualifiable (Measured n a) # | |
(Qualifiable a, Qualifiable b, Qualifiable c) => Qualifiable (a, b, c) # | |
Qualifiable (SubMap b v n m) # |
|
(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. |