diagrams-core-1.4: Core libraries for diagrams EDSL

Copyright(c) 2011-2015 diagrams-core team (see LICENSE)
LicenseBSD-style (see LICENSE)
Maintainerdiagrams-discuss@googlegroups.com
Safe HaskellNone
LanguageHaskell2010

Diagrams.Core.Names

Contents

Description

This module defines a type of names which can be used for referring to subdiagrams, and related types.

Synopsis

Names

Atomic names

data AName where Source #

Atomic names. AName is just an existential wrapper around things which are Typeable, Ord and Show.

Constructors

AName :: (Typeable a, Ord a, Show a) => a -> AName 

_AName :: (Typeable a, Ord a, Show a) => Prism' AName a Source #

Prism onto AName.

Names

newtype Name Source #

A (qualified) name is a (possibly empty) sequence of atomic names.

Constructors

Name [AName] 

Instances

Eq Name Source # 

Methods

(==) :: Name -> Name -> Bool #

(/=) :: Name -> Name -> Bool #

Ord Name Source # 

Methods

compare :: Name -> Name -> Ordering #

(<) :: Name -> Name -> Bool #

(<=) :: Name -> Name -> Bool #

(>) :: Name -> Name -> Bool #

(>=) :: Name -> Name -> Bool #

max :: Name -> Name -> Name #

min :: Name -> Name -> Name #

Show Name Source # 

Methods

showsPrec :: Int -> Name -> ShowS #

show :: Name -> String #

showList :: [Name] -> ShowS #

Semigroup Name Source # 

Methods

(<>) :: Name -> Name -> Name #

sconcat :: NonEmpty Name -> Name #

stimes :: Integral b => b -> Name -> Name #

Monoid Name Source # 

Methods

mempty :: Name #

mappend :: Name -> Name -> Name #

mconcat :: [Name] -> Name #

Wrapped Name Source # 

Associated Types

type Unwrapped Name :: * #

Qualifiable Name Source #

Of course, names can be qualified using (.>).

Methods

(.>>) :: IsName a => a -> Name -> Name Source #

IsName Name Source # 

Methods

toName :: Name -> Name Source #

Rewrapped Name Name Source # 
Each Name Name AName AName Source # 
Action Name (SubMap b v n m) #

A name acts on a name map by qualifying every name in it.

Methods

act :: Name -> SubMap b v n m -> SubMap b v n m #

type Unwrapped Name Source # 

class (Typeable a, Ord a, Show a) => IsName a where Source #

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
  

Methods

toName :: a -> Name Source #

Instances

IsName Bool Source # 

Methods

toName :: Bool -> Name Source #

IsName Char Source # 

Methods

toName :: Char -> Name Source #

IsName Double Source # 

Methods

toName :: Double -> Name Source #

IsName Float Source # 

Methods

toName :: Float -> Name Source #

IsName Int Source # 

Methods

toName :: Int -> Name Source #

IsName Integer Source # 

Methods

toName :: Integer -> Name Source #

IsName () Source # 

Methods

toName :: () -> Name Source #

IsName Name Source # 

Methods

toName :: Name -> Name Source #

IsName AName Source # 

Methods

toName :: AName -> Name Source #

IsName a => IsName [a] Source # 

Methods

toName :: [a] -> Name Source #

IsName a => IsName (Maybe a) Source # 

Methods

toName :: Maybe a -> Name Source #

(IsName a, IsName b) => IsName (a, b) Source # 

Methods

toName :: (a, b) -> Name Source #

(IsName a, IsName b, IsName c) => IsName (a, b, c) Source # 

Methods

toName :: (a, b, c) -> Name Source #

(.>) :: (IsName a1, IsName a2) => a1 -> a2 -> Name infixr 5 Source #

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 Source #

Traversal over each name in a Name that matches the target type.

>>> toListOf eachName (a .> False .> b) :: String
"ab"
>>> a .> True .> b & eachName %~ not
a .> 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 Source #

Instances of Qualifiable are things which can be qualified by prefixing them with a name.

Minimal complete definition

(.>>)

Methods

(.>>) :: IsName a => a -> q -> q infixr 5 Source #

Qualify with the given name.

Instances

Qualifiable Name Source #

Of course, names can be qualified using (.>).

Methods

(.>>) :: IsName a => a -> Name -> Name Source #

Qualifiable a => Qualifiable [a] Source # 

Methods

(.>>) :: IsName a => a -> [a] -> [a] Source #

(Ord a, Qualifiable a) => Qualifiable (Set a) Source # 

Methods

(.>>) :: IsName a => a -> Set a -> Set a Source #

Qualifiable a => Qualifiable (TransInv a) Source # 

Methods

(.>>) :: IsName a => a -> TransInv a -> TransInv a Source #

Qualifiable a => Qualifiable (b -> a) Source # 

Methods

(.>>) :: IsName a => a -> (b -> a) -> b -> a Source #

(Qualifiable a, Qualifiable b) => Qualifiable (a, b) Source # 

Methods

(.>>) :: IsName a => a -> (a, b) -> (a, b) Source #

Qualifiable a => Qualifiable (Map k a) Source # 

Methods

(.>>) :: IsName a => a -> Map k a -> Map k a Source #

Qualifiable a => Qualifiable (Measured n a) Source # 

Methods

(.>>) :: IsName a => a -> Measured n a -> Measured n a Source #

(Qualifiable a, Qualifiable b, Qualifiable c) => Qualifiable (a, b, c) Source # 

Methods

(.>>) :: IsName a => a -> (a, b, c) -> (a, b, c) Source #

Qualifiable (SubMap b v n m) Source #

SubMaps are qualifiable: if ns is a SubMap, then a |> ns is the same SubMap except with every name qualified by a.

Methods

(.>>) :: IsName a => a -> SubMap b v n m -> SubMap b v n m Source #

(Metric v, OrderedField n, Semigroup m) => Qualifiable (QDiagram b v n m) Source #

Diagrams can be qualified so that all their named points can now be referred to using the qualification prefix.

Methods

(.>>) :: IsName a => a -> QDiagram b v n m -> QDiagram b v n m Source #