packages feed

graphwiz-1.0.0: src/Text/Dot/Attributes.hs

module Text.Dot.Attributes where

import "this" Prelude

import Control.Lens

import Text.Dot.Types


--------------------------------------------------------------------------------
-- Attributes access

-- | Retrieves the 'Attributes' of the given t'Entity'.
--
-- Given an entity attribute, return a lens to the corresponding attributes map
-- in a given 'Text.Dot.DotGraph', which is an internal opaque type. This is
-- meant to be used inside the 'Text.Dot.DotT' monad, relying on the fact that
-- it is a State monad under the hood.
--
-- Using @OverloadedLists@ makes working with the full attributes map a bit
-- easier.
--
-- > graph do
-- >   x <- node "x"
-- >
-- >   -- replaces the entire mapping (erases the label!)
-- >   attributes x .= [("fontcolor", "red")]
-- >
-- >   -- combines the existing mapping with the new one, favoring old values
-- >   attributes x <>= [("fontcolor", "blue"), ("fontsize", "12")]
-- >
-- >   -- combines the existing mapping with the new one, favoring new values
-- >   attributes x <>:= [("fontcolor", "blue"), ("fontsize", "12")]
--
-- This function is best used with the provided field accessors, such as
-- 'fontcolor', to be more explicit about the way to deal with previous values.
attributes :: Entity -> Lens' DotGraph Attributes
attributes e = entityAttributes . at e . non mempty

-- | Retrieves the default 'Attributes' of the given 'EntityType'.
--
-- Given an entity type, return a lens to the corresponding default attributes
-- map in a given 'Text.Dot.DotGraph', which is an internal opaque type. This is
-- meant to be used inside the 'Text.Dot.DotT' monad, relying on the fact that
-- it is a State monad under the hood.
--
-- After modifying the defaults for a given entity type, any new such entity
-- will have its attributes set to the new default values.
--
-- > graph do
-- >   node "x"
-- >   use (its fillcolor) -- Nothing
-- >
-- >   defaults Cluster . style ?= "dashed"
-- >   defaults Node <>= [("style", "filled"), ("fillcolor", "forestgreen")]
-- >
-- >   node "y"
-- >   use (its fillcolor) -- Just "forestgreen"
--
-- This function is best used with the provided field accessors, such as
-- 'fontcolor', to be more explicit about the way to deal with previous values.
defaults :: EntityType -> Lens' DotGraph Attributes
defaults t = defaultAttributes . at t . non mempty

-- | Retrieves an attribute from the latest created t'Entity'.
--
-- Given a lens for a specific attribute, such as 'style' or 'label', this
-- combinator creates a lens that points to that attribute for the latest
-- created t'Entity'. Like 'attributes', it is meant to be used within the
-- 'Text.Dot.DotT' monad.
--
-- > graph do
-- >   its title ?= "my graph"
-- >
-- >   bar <- node "bar"
-- >   its fontsize ?= "34"
-- >
-- >   edge bar bar
-- >   its style ?= "dotted"
-- >
-- >   cluster do
-- >     its label ?= "cluster"
its :: Lens' Attributes (Maybe Text) -> Lens' DotGraph (Maybe Text)
its l f d = (attributes (_latest d) . l) f d

-- | Simple alias for 'at'.
--
-- This makes the code a tiny bit more natural when accessing fields by name:
--
-- > graph do
-- >   node "x"
-- >
-- >   -- replace the old value, if any
-- >   its (attribute "fontcolor") ?= "red"
-- >   its (attribute "fontcolor") .= Just "red"
-- >
-- >   -- erase the attribute
-- >   its (attribute "fontcolor") .= Nothing
-- >
-- >   -- set the value if it wasn't previously set
-- >   its (attribute "fontcolor") %= ifAbsent "blue"
--
-- It is however preferable to use one of the provided attribute lenses to avoid
-- raw strings.
attribute :: Text -> Lens' Attributes (Maybe Text)
attribute = at

-- | Replaces a 'Maybe' value only if it wasn't set.
--
-- >>> ifAbsent "foo" Nothing
-- Just "foo"
--
-- >>> ifAbsent "foo" (Just "bar")
-- Just "bar"
--
-- This is best used in conjuction with 'attribute', or one of the explicit
-- attribute accessors.
--
-- > foo <- node "foo"
-- > its fillcolor %= ifAbsent "blue"
ifAbsent :: a -> Maybe a -> Maybe a
ifAbsent x m = m <|> Just x


--------------------------------------------------------------------------------
-- All attributes

-- | Maps to the @_background@ attribute.
background         :: Lens' Attributes (Maybe Text)
background         = attribute "_background"

-- | Maps to the @Damping@ attribute.
damping            :: Lens' Attributes (Maybe Text)
damping            = attribute "Damping"

-- | Maps to the @cluster@ attribute.
isCcluster         :: Lens' Attributes (Maybe Text)
isCcluster         = attribute "cluster"

-- | Maps to the @K@ attribute.
k                  :: Lens' Attributes (Maybe Text)
k                  = attribute "K"

-- | Maps to the @class@ attribute.
svgClass           :: Lens' Attributes (Maybe Text)
svgClass           = attribute "class"

-- | Maps to the @id@ attribute.
svgID              :: Lens' Attributes (Maybe Text)
svgID              = attribute "id"

-- | Maps to the @TBbalance@ attribute.
tbbalance          :: Lens' Attributes (Maybe Text)
tbbalance          = attribute "TBbalance"

-- | Maps to the @URL@ attribute.
url                :: Lens' Attributes (Maybe Text)
url                = attribute "URL"

area               :: Lens' Attributes (Maybe Text)
area               = attribute "area"
arrowhead          :: Lens' Attributes (Maybe Text)
arrowhead          = attribute "arrowhead"
arrowsize          :: Lens' Attributes (Maybe Text)
arrowsize          = attribute "arrowsize"
arrowtail          :: Lens' Attributes (Maybe Text)
arrowtail          = attribute "arrowtail"
bb                 :: Lens' Attributes (Maybe Text)
bb                 = attribute "bb"
beautify           :: Lens' Attributes (Maybe Text)
beautify           = attribute "beautify"
bgcolor            :: Lens' Attributes (Maybe Text)
bgcolor            = attribute "bgcolor"
black              :: Lens' Attributes (Maybe Text)
black              = attribute "black"
center             :: Lens' Attributes (Maybe Text)
center             = attribute "center"
charset            :: Lens' Attributes (Maybe Text)
charset            = attribute "charset"
clusterrank        :: Lens' Attributes (Maybe Text)
clusterrank        = attribute "clusterrank"
color              :: Lens' Attributes (Maybe Text)
color              = attribute "color"
colorscheme        :: Lens' Attributes (Maybe Text)
colorscheme        = attribute "colorscheme"
comment            :: Lens' Attributes (Maybe Text)
comment            = attribute "comment"
compound           :: Lens' Attributes (Maybe Text)
compound           = attribute "compound"
concentrate        :: Lens' Attributes (Maybe Text)
concentrate        = attribute "concentrate"
constraint         :: Lens' Attributes (Maybe Text)
constraint         = attribute "constraint"
decorate           :: Lens' Attributes (Maybe Text)
decorate           = attribute "decorate"
defaultdist        :: Lens' Attributes (Maybe Text)
defaultdist        = attribute "defaultdist"
dim                :: Lens' Attributes (Maybe Text)
dim                = attribute "dim"
dimen              :: Lens' Attributes (Maybe Text)
dimen              = attribute "dimen"
dir                :: Lens' Attributes (Maybe Text)
dir                = attribute "dir"
diredgeconstraints :: Lens' Attributes (Maybe Text)
diredgeconstraints = attribute "diredgeconstraints"
distortion         :: Lens' Attributes (Maybe Text)
distortion         = attribute "distortion"
dpi                :: Lens' Attributes (Maybe Text)
dpi                = attribute "dpi"
edgeURL            :: Lens' Attributes (Maybe Text)
edgeURL            = attribute "edgeURL"
edgehref           :: Lens' Attributes (Maybe Text)
edgehref           = attribute "edgehref"
edgetarget         :: Lens' Attributes (Maybe Text)
edgetarget         = attribute "edgetarget"
edgetooltip        :: Lens' Attributes (Maybe Text)
edgetooltip        = attribute "edgetooltip"
epsilon            :: Lens' Attributes (Maybe Text)
epsilon            = attribute "epsilon"
esep               :: Lens' Attributes (Maybe Text)
esep               = attribute "esep"
fillcolor          :: Lens' Attributes (Maybe Text)
fillcolor          = attribute "fillcolor"
fixedsize          :: Lens' Attributes (Maybe Text)
fixedsize          = attribute "fixedsize"
fontcolor          :: Lens' Attributes (Maybe Text)
fontcolor          = attribute "fontcolor"
fontname           :: Lens' Attributes (Maybe Text)
fontname           = attribute "fontname"
fontnames          :: Lens' Attributes (Maybe Text)
fontnames          = attribute "fontnames"
fontpath           :: Lens' Attributes (Maybe Text)
fontpath           = attribute "fontpath"
fontsize           :: Lens' Attributes (Maybe Text)
fontsize           = attribute "fontsize"
forcelabels        :: Lens' Attributes (Maybe Text)
forcelabels        = attribute "forcelabels"
gradientangle      :: Lens' Attributes (Maybe Text)
gradientangle      = attribute "gradientangle"
group              :: Lens' Attributes (Maybe Text)
group              = attribute "group"
headURL            :: Lens' Attributes (Maybe Text)
headURL            = attribute "headURL"
head_lp            :: Lens' Attributes (Maybe Text)
head_lp            = attribute "head_lp"
headclip           :: Lens' Attributes (Maybe Text)
headclip           = attribute "headclip"
headhref           :: Lens' Attributes (Maybe Text)
headhref           = attribute "headhref"
headlabel          :: Lens' Attributes (Maybe Text)
headlabel          = attribute "headlabel"
headport           :: Lens' Attributes (Maybe Text)
headport           = attribute "headport"
headtarget         :: Lens' Attributes (Maybe Text)
headtarget         = attribute "headtarget"
headtooltip        :: Lens' Attributes (Maybe Text)
headtooltip        = attribute "headtooltip"
height             :: Lens' Attributes (Maybe Text)
height             = attribute "height"
href               :: Lens' Attributes (Maybe Text)
href               = attribute "href"
image              :: Lens' Attributes (Maybe Text)
image              = attribute "image"
imagepath          :: Lens' Attributes (Maybe Text)
imagepath          = attribute "imagepath"
imagepos           :: Lens' Attributes (Maybe Text)
imagepos           = attribute "imagepos"
imagescale         :: Lens' Attributes (Maybe Text)
imagescale         = attribute "imagescale"
inputscale         :: Lens' Attributes (Maybe Text)
inputscale         = attribute "inputscale"
label              :: Lens' Attributes (Maybe Text)
label              = attribute "label"
labelURL           :: Lens' Attributes (Maybe Text)
labelURL           = attribute "labelURL"
label_scheme       :: Lens' Attributes (Maybe Text)
label_scheme       = attribute "label_scheme"
labelangle         :: Lens' Attributes (Maybe Text)
labelangle         = attribute "labelangle"
labeldistance      :: Lens' Attributes (Maybe Text)
labeldistance      = attribute "labeldistance"
labelfloat         :: Lens' Attributes (Maybe Text)
labelfloat         = attribute "labelfloat"
labelfontcolor     :: Lens' Attributes (Maybe Text)
labelfontcolor     = attribute "labelfontcolor"
labelfontname      :: Lens' Attributes (Maybe Text)
labelfontname      = attribute "labelfontname"
labelfontsize      :: Lens' Attributes (Maybe Text)
labelfontsize      = attribute "labelfontsize"
labelhref          :: Lens' Attributes (Maybe Text)
labelhref          = attribute "labelhref"
labeljust          :: Lens' Attributes (Maybe Text)
labeljust          = attribute "labeljust"
labelloc           :: Lens' Attributes (Maybe Text)
labelloc           = attribute "labelloc"
labeltarget        :: Lens' Attributes (Maybe Text)
labeltarget        = attribute "labeltarget"
labeltooltip       :: Lens' Attributes (Maybe Text)
labeltooltip       = attribute "labeltooltip"
landscape          :: Lens' Attributes (Maybe Text)
landscape          = attribute "landscape"
layer              :: Lens' Attributes (Maybe Text)
layer              = attribute "layer"
layerlistsep       :: Lens' Attributes (Maybe Text)
layerlistsep       = attribute "layerlistsep"
layers             :: Lens' Attributes (Maybe Text)
layers             = attribute "layers"
layerselect        :: Lens' Attributes (Maybe Text)
layerselect        = attribute "layerselect"
layersep           :: Lens' Attributes (Maybe Text)
layersep           = attribute "layersep"
layout             :: Lens' Attributes (Maybe Text)
layout             = attribute "layout"
len                :: Lens' Attributes (Maybe Text)
len                = attribute "len"
levels             :: Lens' Attributes (Maybe Text)
levels             = attribute "levels"
levelsgap          :: Lens' Attributes (Maybe Text)
levelsgap          = attribute "levelsgap"
lhead              :: Lens' Attributes (Maybe Text)
lhead              = attribute "lhead"
lheight            :: Lens' Attributes (Maybe Text)
lheight            = attribute "lheight"
linelength         :: Lens' Attributes (Maybe Text)
linelength         = attribute "linelength"
lp                 :: Lens' Attributes (Maybe Text)
lp                 = attribute "lp"
ltail              :: Lens' Attributes (Maybe Text)
ltail              = attribute "ltail"
lwidth             :: Lens' Attributes (Maybe Text)
lwidth             = attribute "lwidth"
margin             :: Lens' Attributes (Maybe Text)
margin             = attribute "margin"
maxiter            :: Lens' Attributes (Maybe Text)
maxiter            = attribute "maxiter"
mclimit            :: Lens' Attributes (Maybe Text)
mclimit            = attribute "mclimit"
mindist            :: Lens' Attributes (Maybe Text)
mindist            = attribute "mindist"
minlen             :: Lens' Attributes (Maybe Text)
minlen             = attribute "minlen"
mode               :: Lens' Attributes (Maybe Text)
mode               = attribute "mode"
model              :: Lens' Attributes (Maybe Text)
model              = attribute "model"
newrank            :: Lens' Attributes (Maybe Text)
newrank            = attribute "newrank"
nodesep            :: Lens' Attributes (Maybe Text)
nodesep            = attribute "nodesep"
nojustify          :: Lens' Attributes (Maybe Text)
nojustify          = attribute "nojustify"
normalize          :: Lens' Attributes (Maybe Text)
normalize          = attribute "normalize"
notranslate        :: Lens' Attributes (Maybe Text)
notranslate        = attribute "notranslate"
nslimit            :: Lens' Attributes (Maybe Text)
nslimit            = attribute "nslimit"
nslimit1           :: Lens' Attributes (Maybe Text)
nslimit1           = attribute "nslimit1"
oneblock           :: Lens' Attributes (Maybe Text)
oneblock           = attribute "oneblock"
ordering           :: Lens' Attributes (Maybe Text)
ordering           = attribute "ordering"
orientation        :: Lens' Attributes (Maybe Text)
orientation        = attribute "orientation"
outputorder        :: Lens' Attributes (Maybe Text)
outputorder        = attribute "outputorder"
overlap            :: Lens' Attributes (Maybe Text)
overlap            = attribute "overlap"
overlap_scaling    :: Lens' Attributes (Maybe Text)
overlap_scaling    = attribute "overlap_scaling"
overlap_shrink     :: Lens' Attributes (Maybe Text)
overlap_shrink     = attribute "overlap_shrink"
pack               :: Lens' Attributes (Maybe Text)
pack               = attribute "pack"
packmode           :: Lens' Attributes (Maybe Text)
packmode           = attribute "packmode"
pad                :: Lens' Attributes (Maybe Text)
pad                = attribute "pad"
page               :: Lens' Attributes (Maybe Text)
page               = attribute "page"
pagedir            :: Lens' Attributes (Maybe Text)
pagedir            = attribute "pagedir"
pencolor           :: Lens' Attributes (Maybe Text)
pencolor           = attribute "pencolor"
penwidth           :: Lens' Attributes (Maybe Text)
penwidth           = attribute "penwidth"
peripheries        :: Lens' Attributes (Maybe Text)
peripheries        = attribute "peripheries"
pin                :: Lens' Attributes (Maybe Text)
pin                = attribute "pin"
pos                :: Lens' Attributes (Maybe Text)
pos                = attribute "pos"
quadtree           :: Lens' Attributes (Maybe Text)
quadtree           = attribute "quadtree"
quantum            :: Lens' Attributes (Maybe Text)
quantum            = attribute "quantum"
rank               :: Lens' Attributes (Maybe Text)
rank               = attribute "rank"
rankdir            :: Lens' Attributes (Maybe Text)
rankdir            = attribute "rankdir"
ranksep            :: Lens' Attributes (Maybe Text)
ranksep            = attribute "ranksep"
ratio              :: Lens' Attributes (Maybe Text)
ratio              = attribute "ratio"
rects              :: Lens' Attributes (Maybe Text)
rects              = attribute "rects"
regular            :: Lens' Attributes (Maybe Text)
regular            = attribute "regular"
remincross         :: Lens' Attributes (Maybe Text)
remincross         = attribute "remincross"
repulsiveforce     :: Lens' Attributes (Maybe Text)
repulsiveforce     = attribute "repulsiveforce"
resolution         :: Lens' Attributes (Maybe Text)
resolution         = attribute "resolution"
root               :: Lens' Attributes (Maybe Text)
root               = attribute "root"
rotate             :: Lens' Attributes (Maybe Text)
rotate             = attribute "rotate"
rotation           :: Lens' Attributes (Maybe Text)
rotation           = attribute "rotation"
samehead           :: Lens' Attributes (Maybe Text)
samehead           = attribute "samehead"
sametail           :: Lens' Attributes (Maybe Text)
sametail           = attribute "sametail"
samplepoints       :: Lens' Attributes (Maybe Text)
samplepoints       = attribute "samplepoints"
scale              :: Lens' Attributes (Maybe Text)
scale              = attribute "scale"
searchsize         :: Lens' Attributes (Maybe Text)
searchsize         = attribute "searchsize"
sep                :: Lens' Attributes (Maybe Text)
sep                = attribute "sep"
shape              :: Lens' Attributes (Maybe Text)
shape              = attribute "shape"
shapefile          :: Lens' Attributes (Maybe Text)
shapefile          = attribute "shapefile"
showboxes          :: Lens' Attributes (Maybe Text)
showboxes          = attribute "showboxes"
sides              :: Lens' Attributes (Maybe Text)
sides              = attribute "sides"
size               :: Lens' Attributes (Maybe Text)
size               = attribute "size"
skew               :: Lens' Attributes (Maybe Text)
skew               = attribute "skew"
smoothing          :: Lens' Attributes (Maybe Text)
smoothing          = attribute "smoothing"
sortv              :: Lens' Attributes (Maybe Text)
sortv              = attribute "sortv"
splines            :: Lens' Attributes (Maybe Text)
splines            = attribute "splines"
start              :: Lens' Attributes (Maybe Text)
start              = attribute "start"
style              :: Lens' Attributes (Maybe Text)
style              = attribute "style"
stylesheet         :: Lens' Attributes (Maybe Text)
stylesheet         = attribute "stylesheet"
tailURL            :: Lens' Attributes (Maybe Text)
tailURL            = attribute "tailURL"
tail_lp            :: Lens' Attributes (Maybe Text)
tail_lp            = attribute "tail_lp"
tailclip           :: Lens' Attributes (Maybe Text)
tailclip           = attribute "tailclip"
tailhref           :: Lens' Attributes (Maybe Text)
tailhref           = attribute "tailhref"
taillabel          :: Lens' Attributes (Maybe Text)
taillabel          = attribute "taillabel"
tailport           :: Lens' Attributes (Maybe Text)
tailport           = attribute "tailport"
tailtarget         :: Lens' Attributes (Maybe Text)
tailtarget         = attribute "tailtarget"
tailtooltip        :: Lens' Attributes (Maybe Text)
tailtooltip        = attribute "tailtooltip"
target             :: Lens' Attributes (Maybe Text)
target             = attribute "target"
tooltip            :: Lens' Attributes (Maybe Text)
tooltip            = attribute "tooltip"
truecolor          :: Lens' Attributes (Maybe Text)
truecolor          = attribute "truecolor"
vertices           :: Lens' Attributes (Maybe Text)
vertices           = attribute "vertices"
viewport           :: Lens' Attributes (Maybe Text)
viewport           = attribute "viewport"
voro_margin        :: Lens' Attributes (Maybe Text)
voro_margin        = attribute "voro_margin"
weight             :: Lens' Attributes (Maybe Text)
weight             = attribute "weight"
width              :: Lens' Attributes (Maybe Text)
width              = attribute "width"
xdotversion        :: Lens' Attributes (Maybe Text)
xdotversion        = attribute "xdotversion"
xlabel             :: Lens' Attributes (Maybe Text)
xlabel             = attribute "xlabel"
xlp                :: Lens' Attributes (Maybe Text)
xlp                = attribute "xlp"
z                  :: Lens' Attributes (Maybe Text)
z                  = attribute "z"