02U      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst u v w x y z { | } ~                                                !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~           !!!!!!!!! ! ! ! ! !!!!!!!!!"""""""""" "!"""#"$"%"&"'"(")"*"+","-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J$K%L&M&N&O&P&Q&R&S&T&U&V&W&X&Y&Z&[&\&]'^'_'`'a'b'c'd'e'f(g(h(i(j(k(l(m(n(o(p(q(r(s(t)u)v)w)x)y)z){)|)})~))))))))))**********************+++++++,,,,,,,,,,,,,,,,-------------------------------.......///0000000000000001111111222222222222222338GHC unstablestephen.tetley@gmail.com    GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>  Times-Roman  Times Italic  Times Bold Times Bold Italic  Helvetica Helvetica Oblique Helvetica Bold Helvetica Bold Oblique Courier Courier Oblique  Courier Bold Courier Bold Oblique Symbol >Note - Symbol is intentionally not supported for SVG by some = renderers (Firefox). Chrome is fine, but the use of symbol . should be still be avoided for web graphics.   GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>K      !"#$%&'()*+,-. A draw a  straight line% of length 0 at the supplied point. This is might) be useful in concatenating curved paths + as it introduces and extra control point. //- throws a runtime error if the supplied list  is empty. 00) consumes 4 points from the list on the : intial step (start, control1, control2, end) then steps 7 through the list taking 3 points at a time thereafter > (control1,control2, end). Leftover points are discarded. 0- throws a runtime error if the supplied list @ is has less than 4 elements (start, control1, control2, end). 12'Turn a Path into an ordinary PrimPath. 9Assumes path is properly formed - i.e. end point of one : segment is the same point as the start point of the next  segment.  Jens Gravesen'$s bezier arc-length approximation. =Note this implementation is parametrized on error tolerance. mid-point between two points  "Curve subdivision via de Casteljau' s algorithm. !2subdivide with an affine weight along the line... "345Shorten both ends... +u should be less-than half the path length 6+Note - shortening a line from the left by ? greater-than-or-equal its length is operationally equivalent 0 to making a zero-length line at the end point. #$%7,Note - shortening a line from the right by ? greater-than-or-equal its length is operationally equivalent 2 to making a zero-length line at the start point. &'(8/Direction of empty path is considered to be 0. 9/Direction of empty path is considered to be 0. :;<=>?@A' !"#$%&'()*+,-./0123456789:;<=>?@A')*+,-./0123456789:;<=>? #!"$'%&(@A' !"#!"$%&'%&()*+,-./0123456789:;<=>?@AGHCunstable)Stephen Tetley <stephen.tetley@gmail.com>8BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy8BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy8BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy8BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyGHCunstable)Stephen Tetley <stephen.tetley@gmail.com>z{|}~    z{|}~    z{|}~    z{|}~    GHCunstablestephen.tetley@gmail.com Version number  (0,14,0)    GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>9Doc is a Join List ... )*+,-./'Create an empty, zero length document. )Create a document from a ShowS function. 6Horizontally concatenate two documents with no space  between them. <Horizontally concatenate two documents with a single space  between them. 6Vertical concatenate two documents with a line break. 2Horizontally concatenate a list of documents with (<>). 2Horizontally concatenate a list of documents with (<+>). 9Vertically concatenate a list of documents, with a line  break between each doc. )Create a document from a literal string. <The string should not contain newlines (though this is not  enforced). ,Create a document from a literal character. *The char should not be a tab or newline. Show the Int as a Doc.  int = text . show Show the Integer as a Doc. Show an "integral value" as a Doc via 0.  Show the Float as a Doc. !Show the Double as a Doc. "8Show the Int as hexadecimal, padding up to 4 digits if  necessary. 9No trucation occurs if the value has more than 4 digits. #2Create a Doc containing a single space character. $!Create a Doc containing a comma, ",". %&Create a Doc containing a semi colon, ";". &!Create a Doc containing newline, "\n". ':Fill a doc to the supplied length, padding the right-hand  side with spaces. >Note - this function is expensive - it unrolls the functional  representation of the String. /Also it should only be used for single line Doc's. 1(String version of '. This is more efficient than ' as the input is a string " so its length is more accesible. 6Padding is the space character appended to the right. )Left-padding version of (. *=Punctuate the Doc list with the separator, producing a Doc. +,Enclose the final Doc within the first two. +There are no spaces between the documents:  enclose l r d = l <> d <> r ,&Enclose the Doc within single quotes. -&Enclose the Doc within double quotes. .Enclose the Doc within parens (). /'Enclose the Doc within square brackets []. 0$Enclose the Doc within curly braces {}. 1&Enclose the Doc within angle brackets <>. 2&Create a Doc containing a left paren, '('. 3'Create a Doc containing a right paren, ')'. 4/Create a Doc containing a left square bracket, '['. 50Create a Doc containing a right square bracket, ']'. 6,Create a Doc containing a left curly brace, '{'. 7-Create a Doc containing a right curly brace, '}'. 8.Create a Doc containing a left angle bracket, '<'. 9/Create a Doc containing a right angle bracket, '>'. :;Comma separate the list of documents and enclose in square  brackets. ;<Comma separate the list of documents and enclose in parens. <9Separate the list with a semicolon and enclose in curly  braces. =Horizontally indent a Doc. &Note - this space-prefixes the Doc on the current line. It = does not indent subsequent lines if the Doc spans multiple  lines. >Write a Doc to file. 1 !"#$%&'()*+,-./0123456789:;<=>1 !"#$%&'()*+,-./0123456789:;<=>1 !"#$%&'()*+,-./0123456789:;<=>GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>>?@AB2345CDEFG67HI89JKLThis one is from Chris Okasaki's "Even Higher-Order  Functions for Parsing". M;Peek tries the supplied parse, but does not consume input  ** even when the parse succeeds **. NOPQRSTUV:Applicative cons. WXYZ[\]^_``" an alias for Control.Applicative ;. abcdefghijklmnopqrs5?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs5BCEDA@?FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs5?@ABCEDDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>t;Opaque type representing a parser that consumes arbitrary  space.  Unlike Parsec'1s lexeme parser, this can be customized so that 0 e.g. newlines are not consumed as white space. <=u#Build a lexeme parser that handles space. Space' is zero or more elements matching the isSpace  predicate from  Data.Char. v-Build a lexeme parser that handles arbitrary space. space5 is parametric, for instance this can manufacture a : lexeme parser that consumes space and tab chars but not  newline. w;Build a lexeme parser that handles start-and-end delimited  comments and arbitrary space. x;Build a lexeme parser that handles line spanning comments  an arbitrary space. y;Build a lexeme parser that handles start-and-end delimited ' comments, line comments and arbitrary space. >?@z<Wrap a CharParser with a lexeme parser, the CharParser will : consume trailing space according to the strategy of the  LexemeParser. {|}~tuvwxyz{|}~tuvwxyz{|}~tuvwxyz{|}~ GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>8GhostScript version that the aliases were derived from. ghostscript_version :: String  ghostscript_version = gs8.54 A map from standard Adode PostScript font name to the 0 equivalent GhostScript font and AFM file name. >It is expected that all GhostScript AFM files will be located  in the same directory. Get the .afm metrics file. <Note this return only the file name and not the path to it. 0 The full path must be resolved in client code. %Get the GhostScript font name alias. 5Get the GhostScript version number that the FontMap  represents. 4Map from PostScript font name to the corresponding  GhostScript name and file. 0Naming is correct for GhostSCript version 8.54.  GHCunstablestephen.tetley@gmail.com 6velo consumes the list as per map, but builds it back , as a Hughes list - so items can be dropped  replaced, repeated, etc...     GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>ABCDEFG    GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>Supplied point is  bottom-left.  : 5 half_width * half_height * center_point -> PrimPath   : ' num_points * radius * center -> [point]   isocelesTriangle bw h pt<Supplied point is the centriod of the triangle. This has a . nicer visual balance than using half-height.  isocelesTriangle bw h pt<Supplied point is the centriod of the triangle. This has a . nicer visual balance than using half-height. GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>HIJKLine in equational form, i.e. Ax + By + C = 0. LMNOPQRSTUV:Calculate the counter-clockwise angle between two points  and the x-axis.   GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>*A map between a font name and MetricsOps. WX tfor a particular named font. )Operations on the metrics set of a font. >The is the internal representation used by Wumpus-Basic after  parsing the font file. A lookup from code point to  width vector. ?Note - in PostScript terminology a width vector is not obliged 9 to be left-to-right (writing direction 0). It could be & top-to-bottom (writing direction 1). A Unicode code-point. 8This ignores the Char code lookup and just returns the  default advance vector. GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>!5The metrics read from a font file by a font loader. "NOTE - FontProps is parametric on cu - Character Unit and  not on the usual u. A typical character unit is , < the unit of measurement for AFM files (1000th of a point). =The is the initial representation used by Wumpus-Basic as an ' syntax tree when loading font files. 9Monospace defaults are used if the font loader fails to  extract the necessary fields. =The values are taken from the font correpsonding to Courier  in the distributed font files. >Wumpus needs a very small subset of AFM files, common to both  version 2.0 and version 4.1. >Note - Bounding Box is mandatory for AFM versions 3.0 and 4.1 ?Cap Height is optional in AFM versions 3.0 and 4.1. As Wumpus ? uses cap height in calculations, glyph metrics must be build / with an arbitrary value if it is not present. *Encoding Scheme is optional in AFM files. Afm files index glyphs by PostScript character code. This & is not the same as Unicode, ASCII... #It is expected to be determined by EncodingScheme in the " Global Font Information Section. Wrapped Double representing 1/1000 of the scale factor < (Point size) of a font. AFM files encode all measurements  as these units. YZ=Compute the size of a measurement in Afm units scaled by the  point size of the font. 9Build a MetricsOps function table, from a character unit 2 scaling function and FontProps read from a file. GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>[\]^_` aka liftIO The standard monadic sequence would finish on first fail = for the FontLoadIO monad. As we want to be able to sequence 9 the loading of a list of fonts, this is not really the B behaviour we want for Wumpus. Instead we prefer to use fallback @ metrics and produce an inaccurate drawing on a font load error * rather than fail and produce no drawing. a8Afm files do not have a default advance vec so use the  monospace default. Afm files hopefully have  CapHeight and FontBBox properties < in the header. Use the monospace default only if they are  missing. bc   GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>d;Strictly speaking a fontBBox is measured in integer units. efGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>ghiGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> jk   GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>    lmnCourier "Project a value out of a context.               GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>#Because textAttr* is so commonly used here is a functional  version that avoids tupling.  !"#$%&'(9Vertical distance between baselines of consecutive text  lines. )The mark4 height is the height of a lowercase letter in the  current font. =Arrowheads, dots etc. should generally be drawn at the mark  height. *o+,-./p01234q5Height of a lower case 'x' in Courier. 'x'" has no ascenders or descenders. 678=Query the dimensions of the text using the current font size ) but using metrics derived from Courier. 8Note - the width will generally be a over-estimate for  non-monospaced fonts. 9The heigth of n lines of text, which is  n lines + n-1 line spacers :#The default padding is half of the  char width. ;$Vector from baseline left to center  !"#$%&'()*+,-./0123456789:;  !"#$%&')*(+,-./0123456789:;  !"#$%&'()*+,-./0123456789:;GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>!rs<tuv=Set the line width to a thick. Note this context update is  oblivious - operationally the  line width is set to exactly 2.0. >?w@ABxCDEFGHIJKLMNO<Set the font size to double the current size, note the font 7 size also controls the size of dots, arrowsheads etc. P:Set the font size to half the current size, note the font 7 size also controls the size of dots, arrowsheads etc. ;As fontsize is an integer this is not exact - half size of  15pt type is 7pt. QRSTU<=>?@ABCDEFGHIJKLMNOPQRSTU<=>?@ABCDEFGHIJKLNMOPQRSTU<=>?@ABCDEFGHIJKLMNOPQRSTUGHC highly unstablestephen.tetley@gmail.comV4A monad that supplies points, e.g. a turtle monad. ** WARNING *** - the idea behind this class is somewhat = half-baked. It may be revised or even dropped in subsequent  versions of Wumpus-Basic. WX;DUnit is always for fully saturated type constructors, so = (seemingly) an equivalent type family is needed for monads. YY# is a type representing functions  from Radian * Point to Point. <It is useful for building arrowheads which are constructed @ with an implicit angle representing the direction of the line  at the arrow tip. ZZ# is a type representing functions  from Point to Point. ?It is especially useful for building composite graphics where @ one part of the graphic is drawn from a different start point  to the other part. [9Advance vectors provide an idiom for drawing consecutive > graphics. PostScript uses them to draw left-to-right text - 9 each character has an advance vector for the width and > as characters are drawn they successively displace the start 9 point for the next character with their advance vector. Type alias for Vec2. \:Vertical alignment - align to the left, center or bottom. ]^_`;Horizontal alignment - align to the top, center or bottom. abcdA Bifunctor class. >Again, it would be nice if there was a Bifunctor class in the  Haskell Base libraries... efghA Semigroup class. ?The perhaps unusual name is the TeX name for the circled plus ? glyph. It would be nice if there was a semigroup class in the  Haskell Base libraries... ijklm7Extract the horizontal component of an advance vector. ;For left-to-right latin text, the vertical component of an 8 advance vector is expected to be 0. Ingoring it seems  permissible when drawing text. n6Extract the verticall component of an advance vector. oo :  x -> y -> PointDisplace  Build a combinator to move Points by the supplied x and  y distances. pr :  (V2 x y) -> PointDisplace   Version of o' where the displacement is supplied as & a vector rather than two parameters. qq :  x -> PointDisplace  Build a combinator to move Points by horizontally the  supplied x distance. rr :  y -> PointDisplace  Build a combinator to move Points vertically by the supplied  y distance. ss :  dist -> ThetaPointDisplace  Build a combinator to move Points in parallel to the ; direction of the implicit angle by the supplied distance  dist. ts :  dist -> ThetaPointDisplace  Build a combinator to move Points perpendicular to the ; direction of the implicit angle by the supplied distance  dist. VWXYZ[\]^_`abcdefghijklmnopqrsthijdefgkl`cba\_^][mnZopqrYstXVWVWWXYZ[\_^]]^_`cbaabcdefgefghiijklmnopqrstGHC highly unstablestephen.tetley@gmail.com(u Alias of x( where the unit type is specialized to  Double. v Alias of y( where the unit type is specialized to  Double. w Alias of z( where the unit type is specialized to  Double. xType specialized verison of { where the static arguments  are the  start point and the  end point. = ConnectorCF :: DrawingContext -> Point2 u -> Point2 u -> a yType specialized verison of { where the static arguments  are the  start point and the angle of displacement. : LocThetaCF :: DrawingContext -> Point2 u -> Radian -> a zType specialized verison of | where the static argument  is the  start point. + LocCF :: DrawingContext -> Point2 u -> a { Variation of } with two parametric static arguments. ?The first argument is commonly a point representing the start  point /1 origin of a drawing. The second argument might B typically be the angle of displacement (for drawing arrowheads) > or an end point (for drawing connectors between two points). ) CF2 :: DrawingContext -> r1 -> r2 -> a yz| Variation of } with one parametric static argument. @The static argument is commonly a point representing the start  point / origin of a drawing. # CF1 :: DrawingContext -> r1 -> a {|}:Most drawing operations in Wumpus-Basic have an implicit  graphics state the , so the most primitive ? building block is a function from the DrawingContext to some  polymorphic answer. @This functional type is represented concretely as the initials  CF for contextual function.  CF :: DrawingContext -> a }~~Run a CF' (context function) with the supplied  DrawingContext. Run a CF1' (context function) with the supplied  DrawingContext and static argument. Run a CF1' (context function) with the supplied  DrawingContext and two static arguments. #Lift a zero-arity context function } to an arity one  context function |. #Lift a zero-arity context function } to an arity two  context function {. #Lift an arity one context function | to an arity two  context function {. Promote a function 'from one argument to a Context function  to an arity one Context function. 7The type signature is as explanatory as a description: ' promoteR1 :: (r1 -> CF a) -> CF1 r1 a Promote a function (from two arguments to a Context function  to an arity two Context function. 7The type signature is as explanatory as a description: 0 promoteR2 :: (r1 -> r2 -> CF a) -> CF2 r1 r2 a ;Apply an arity-one Context function to a single argument, < downcasting it by one level, making an arity-zero Context  function. 7The type signature is as explanatory as a description: $ apply1R1 :: CF1 r1 a -> r1 -> CF a 7Apply an arity-two Context function to two arguments, = downcasting it by two levels, making an arity-zero Context  function. 7The type signature is as explanatory as a description: - apply2R2 :: CF2 r1 r2 a -> r1 -> r2 -> CF a 6Apply an arity-two Context function to one argument, ; downcasting it by one level, making an arity-one Context  function. 7The type signature is as explanatory as a description: + apply1R2 :: CF2 r1 r2 a -> r2 -> CF1 r1 a +Extract the drawing context from a CtxFun.  (ctx -> ctx) 6Apply the projection function to the drawing context.  (ctx -> a) -> (ctx -> a) *Extract the drawing context from a LocCF.  (ctx -> pt -> ctx)  Extract the start point from a LocCF.  (ctx -> pt -> pt) /Extract the drawing context from a LocThetaCF.  (ctx -> pt -> ang -> ctx)  Extract the start point from a LocThetaCF.  (ctx -> pt -> ang -> pt) %Extract the angle from a LocThetaCF.  (ctx -> pt -> ang -> ang) 0Extract the drawing context from a ConnectorCF.  (ctx -> pt1 -> pt2 -> ctx) ,Extract the start point from a ConnectorCF.  (ctx -> pt1 -> pt2 -> pt1) *Extract the end point from a ConnectorCF.  (ctx -> pt1 -> pt2 -> pt2)  Downcast a z* function by applying it to the supplied 0 point, making an arity-zero Context function.  Remember a z function is a | context function where  the static argument" is specialized to a start point.  Downcast a y! function by applying it to the : supplied angle, making an arity-one Context function (a  z).  Downcast a x! function by applying it to the = start and end point, making an arity-zero Context function  (a }). Chaining combinator - the answer of the A first Context function is feed to the second Context function. 'This contrasts with the usual idiom in  Wumpus-Basic where A composite graphics are built by applying both functions to the  same initial static argument.  Desciption: >Evaluate the first Context Function with the drawing context  and the  initial state st0#. The result of the evaluation is  a new state st1 and and answer a1. ?Evaluate the second Context Function with the drawing context  and the new state st1, producing a new state s2 and an  answer a2. 1Return the result of combining the answers with  op :: (ans -> ans -> ans) and the second state s2.  H (ctx -> s1 -> (w,s1)) -> (ctx -> s1 -> (w,s1)) -> (ctx -> s1 -> (w,s1))?This models chaining start points together, which is the model @ PostScript uses for text output when successively calling the  show operator. "uvwxyz{|}~"}|{zyxwvu~"uvwxyz{|}~GHC highly unstablestephen.tetley@gmail.com =Graphics objects, even simple ones (line, arrow, dot) might = need more than one primitive (path or text label) for their ? construction. Hence, the primary representation that all the $ others are built upon must support  concatenation of  primitives. 8Wumpus-Core has a type Picture - made from one or more ? Primitives - but Pictures include support for affine frames. > For drawing many simple graphics (dots, connector lines...) ? that do not need individual affine transformations this is a ; penalty. A list of Primitives is therefore more suitable 2 representation, and a Hughes list which supports " efficient concatenation is wise. 9Collect elementary graphics as part of a larger drawing. 'TraceM works much like a writer monad.    GHCunstablestephen.tetley@gmail.com Scaling... GHC highly unstablestephen.tetley@gmail.com A query on the DrawingContext.  Alias for }. 9A query on the DrawingContext respective to the supplied  point.  Alias for z. 9A query on the DrawingContext respective to the supplied  point and angle.  Alias for z. :An Image always returns a pair of some polymorphic answer a  and a PrimGraphic. $Note a PrimGraphic cannot be empty. %Draw a PrimGraphic repsective to the DrawingContext and  return some answer a. %Draw a PrimGraphic respective to the DrawingContext and ( the supplied point, return some answer a. %Draw a PrimGraphic respective to the DrawingContext and  the supplied point and angle.    GHC highly unstablestephen.tetley@gmail.com8ConnectorImage is a connector drawn between two points  constructing an Image. >Usually the answer type of a ConnectorImage will be a Path so  the Points ar midway, atstart etc. can be taken on it. :ConnectorGraphic is a connector drawn between two points  contructing a Graphic. GHC highly unstablestephen.tetley@gmail.com, Alias of % where the unit type is specialized  to Double.  Originated2 drawing - produce a primitive respective to the > supplied start-point, access the DrawingContext as required.  Alias of ( where the unit type is specialized to  Double.  Originated2 drawing - produce a primitive respective to the > supplied start-point, access the DrawingContext as required.  Alias of ( where the unit type is specialized to  Double. @Simple drawing - produce a primitive, access the DrawingContext B as required, e.g for fill colour, stroke colur, line width, etc. Build an Image... Build a LocImage... Build a LocThetaImage... 6Move the start-point of a LocImage with the supplied  displacement function. 6Move the start-point of a LocImage with the supplied  displacement function. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. 8Build an empty LocGraphic - this is a path with a start  point but no path segments. The  It is treated as a null primitive by   Wumpus-Core0 and is not drawn, although it does generate a 3 minimum bounding box at the implicit start point.  :  path -> Graphic  This is the analogue to  in  Wumpus-core , but the ? drawing properties (colour, line width, etc.) are taken from  the implicit DrawingContext.  :  path -> Graphic  This is the analogue to  in  Wumpus-core , but the ? drawing properties (colour, line width, etc.) are taken from  the implicit DrawingContext.  :  path -> Graphic  This is the analogue to  in  Wumpus-core , but the ( fill colour is taken from the implicit DrawingContext.  :  path -> Graphic  This is the analogue to  in  Wumpus-core , but the > drawing properties (fill colour, border colour, line width, # etc.) are taken from the implicit DrawingContext. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. This is the analogue to  in  Wumpus-core. This is the analogue to rstrokeEllispe in  Wumpus-core. This is the analogue to  fillEllispe in  Wumpus-core. This is the analogue to  rfillEllispe in  Wumpus-core. This is the analogue to fillStrokeEllispe in  Wumpus-core. This is the analogue to rfillStrokeEllispe in  Wumpus-core. :Draw a straight line formed from displacing the implicit ' start point with the supplied vector. 9Draw a straight line - start and end point are supplied  explicitly. :Draw a Bezier curve - all points are supplied explicitly. Supplied point is  bottom left. Supplied point is  bottom left. Supplied point is  bottom left. 7Supplied point is center. Circle is drawn with Bezier  curves. 7Supplied point is center. Circle is drawn with Bezier  curves. 7Supplied point is center. Circle is drawn with Bezier  curves. disk is drawn with Wumpus-Core's ellipse primitive. 5This is a efficient representation of circles using  PostScript's arc or SVG's circle in the generated : output. However, stroked-circles do not draw well after < non-uniform scaling - the line width is scaled as well as  the shape. 8For stroked circles that can be adequately scaled, use   instead. Filled disk... bordered disk... ***GHC highly unstablestephen.tetley@gmail.comAdvance vector& graphic - this partially models the  PostScript show command which moves the  current point by the 4 width (advance) vector as each character is drawn. 9Construction is different to intoZZ functions hence the  different name. ** WARNING ** - pending removal.  GHC highly unstablestephen.tetley@gmail.com %LocThetaGraphic with a bounding box. &Note the size of bounding box for the "same" shape will vary 6 according to the rotation. A bounding box is always ' orthonormal (?) to the x- and y-axes.  LocGraphic with a bounding box. Graphic with a bounding box.  :  theta * bbox -> BBox  Rotate a bounding box by theta about its center. Take the  new bounding box. @Remember that bounding boxes are always orthonormal rectangles, > so the dimensions as well as the positions may change under  rotation.    !GHC unstablestephen.tetley@gmail.com<Run the drawing returning only the output it produces, drop * any answer from the monadic computation. =Run the drawing ignoring the output it produces, return the & answer from the monadic computation. >Note - this useful for testing, generally one would want the : opposite behaviour (return the drawing, ignore than the  answer).   Unsafe promotion of HPrim to Picture. 3If the HPrim is empty, a run-time error is thrown.  Safe promotion of HPrim to (Maybe Picture). If the HPrim is empty, then Nothing is returned.  Unsafe promotion of (Maybe Picture) to Picture. This is equivalent to:  ! fromMaybe (error "empty") $ pic ;This function is solely a convenience, using it saves one  import and a few characters. If the supplied value is Nothing a run-time error is thrown.  2Draw a Graphic taking the drawing style from the  drawing context.  This operation is analogeous to tell in a Writer monad. Hyperlink version of . 1Draw an Image taking the drawing style from the  drawing context. ?The graphic representation of the Image is drawn in the Trace $ monad, and the result is returned.  Forgetful . Hyperlink version of .  Forgetful .                "GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>6Anchor on a border that can be addressed by an angle. ?The angle is counter-clockwise from the right-horizontal, i.e.  0 is east. ?Secondary group of cardinal (compass) positions on an object. =It seems possible that for some objects defining the primary = compass points (north, south,...) will be straight-forward 7 whereas defining the secondary compass points may be < problemmatic, hence the compass points are split into two  classes. ,Cardinal (compass) positions on an object. ;Note - in TikZ cardinal anchors are not necessarily at the @ equivalent radial position, for instance reactangle north-east = is the top-right corner whether or not this is incident at  45deg. .Wumpus generally follows the TikZ convention.  !"Center of an object. #$$ :  dist * object -> Point  ;Project the anchor along a line from the center that goes  through the north anchor. =If the distance is zero the answer with be the north anchor. AIf the distance is negative the answer within the object before  the north anchor. ;If the distance is positive the anchor outside the object. %% :  dist * object -> Point  Variant of the function $, but projecting the line + southwards from the center of the object. && :  dist * object -> Point  Variant of the function $, but projecting the line * eastwards from the center of the object. '' :  dist * object -> Point  Variant of the function $, but projecting the line * westwards from the center of the object. (( :  dist * object -> Point  Variant of the function $, but projecting the line / northeastwards from the center of the object. )) :  dist * object -> Point  Variant of the function $, but projecting the line / southeastwards from the center of the object. ** :  dist * object -> Point  Variant of the function $, but projecting the line / southwestwards from the center of the object. ++ :  dist * object -> Point  Variant of the function $, but projecting the line / northwestwards from the center of the object. ,, : + object_a * object_b -> (Point_a, Point_b)  .Find the radial connectors points for objects a and b along ! the line joining their centers.  !"#$%&'()*+,"# !$%&'()*+, ! !"##$%&'()*+,#GHC unstablestephen.tetley@gmail.com4-./0123The center of a picture. 'Extract the mid point of the top edge. *Extract the mid point of the bottom edge. (Extract the mid point of the left edge. )Extract the mid point of the right edge. Extract the top-left corner. Extract the top-right corner.  Extract the bottom-left corner. !Extract the bottom-right corner. 4  a `over` b Place 'drawing' a over b. The idea of over here is in = terms z-ordering, nither picture a or b are actually moved. 5  a `under` b  Similarly under! draws the first drawing behind  the second but move neither. *Move in both the horizontal and vertical. 6Draw a, move b) so its center is at the same center as  a, b) is drawn over underneath in the zorder.  a `centeric` b 7  a `nextToH` b Horizontal composition - move b, placing it to the right  of a. 8  a `nextToV` b Vertical composition - move b, placing it below a. 9)Place the picture at the supplied point. 9 was previous the  operator. :*Center the picture at the supplied point. ;#Concatenate the list of drawings. No pictures are moved. <Concatenate the list pictures xs horizontally. =!Concatenate the list of pictures xs vertically. >  hspace n a b Horizontal composition - move b, placing it to the right  of a with a horizontal gap of n separating the pictures. ?  vspace n a b Vertical composition - move b, placing it below a with a  vertical gap of n separating the pictures. @  hsep n xs !Concatenate the list of pictures xs horizontally with  hspace starting at x&. The pictures are interspersed with  spaces of n units. A  vsep n xs !Concatenate the list of pictures xs vertically with  vspace starting at x&. The pictures are interspersed with  spaces of n units. B  alignH align a b Horizontal composition - move b, placing it to the right  of a0 and align it with the top, center or bottom of a. C  alignV align a b Vertical composition - move b, placing it below a 0 and align it with the left, center or right of a. D  alignHSep align sep a b !Spacing version of alignH - move b to the right of a  separated by sep units, align b according to align. E  alignVSep align sep a b !Spacing version of alignV - move b below a  separated by sep units, align b according to align. F Variant of <% that aligns the pictures as well as  concatenating them. G Variant of =% that aligns the pictures as well as  concatenating them. H Variant of hsep% that aligns the pictures as well as ! concatenating and spacing them. I Variant of vsep% that aligns the pictures as well as ! concatenating and spacing them. -./0123456789:;<=>?@ABCDEFGHI-./0123456789:;<=>?@ABCDEFGHI-./0123456789:;<=>?@ABCDEFGHI4GHC highly unstablestephen.tetley@gmail.comb     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI$GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>JJ :   path_to_afm_fonts * [font_name] -> IO (metrics, messages)  "Load the supplied list of fonts. <Note - if a font fails to load a message is written to the  log and monospaced fallback metrics are used. >These are values extracted from Courier in the core 14 fonts. JJJ%GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>KK :   path_to_gs_fonts * [font_name] -> IO (metrics, messages)  "Load the supplied list of fonts. <Note - if a font fails to load a message is written to the  log and monospaced fallback metrics are used. )These are values extracted from the file  n022003l.afm  which is the font NimbusMonL-Regu , GhostScript' s eqivalent $ font for the core 14 font Courier. KKK&GHC unstablestephen.tetley@gmail.comLMN5IterAlg is a variant of AnaAlg that builds infinite  sequences (iterations). =When lifted to a Chain an iteration is bounded by a count so  it will terminate. OP6Chains are built as unfolds - AnaAlg avoids the pair > constructor in the usual definition of unfoldr and makes the  state strict. AIt is expected that all Chains built on unfolds will terminate. QRSTUVWXYZ[\LMNOPQRSTUVWXYZ[\TSUVWPRQNOMXLYZ[\LMNOOPRQQRSTUVWXYZ[\'GHC unstablestephen.tetley@gmail.com ]^_`abcde ]^_`abcde ]^_`abcde ]^_`abcde5GHC unstablestephen.tetley@gmail.comLMNOPQRSTUVWXYZ[\]^_`abcde(GHCunstablestephen.tetley@gmail.com%5max_width * interim_text * theta -> (Point -> Point) ,max_width * oneline_text -> LocThetaGraphic ,max_width * oneline_text -> LocThetaGraphic ;Draw one line of left-aligned text, knowing the max_width  of all the lines of text. ;All left-aligned text is moved left by half the max_width. ;Note - implicit point is baseline-center, this is perhaps 6 unintituitive given the functions name but it is an ( advantage for drawing multi-line text. >Draw one line of center-aligned text. Center aligned text is 6 oblivious to the max_width of all the lines of text. <Each line of center-aligned text is moved left by half its  advance vector. #Implicit point is baseline-center. <Draw one line of right-aligned text, knowing the max_width  of all the lines of text. >Each right-aligned text line is moved by the width component 1 of the advance vector minus half the max width. ;Note - implicit point is baseline-center, this is perhaps 6 unintituitive given the functions name but it is an ( advantage for drawing multi-line text. fDraw 1 line... !Impilict point is baseline-left. gDraw 1 line... #Impilict point is baseline-center. hDraw 1 line... "Impilict point is baseline-right. ijklmnopqrsana is an  anacrusis# factor - if there are even points 9 half the baseline_spacing is added to get the top point fghijklmnopqrsgfhjiklmnopqrsfghijklmnopqrs)GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>tuSupplied point is the center. vwxyz{|}~Note disk is filled. tuvwxyz{|}~tuvwxyz{|}~tuvwxyz{|}~*GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>-(Note - dotText now uses font metrics... +GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> :  ( altitude * start_pt * end_pt -> mid_pt  Triangular midpoint. u9 is the altitude of the triangle - negative values of u # form the triangle below the line.  :  : altitude * start_pt * end_pt * (third_pt, two_thirds_pt)  ;Double triangular joint - one joint at a third of the line " length, the other at two thirds.  :  6 altitude * start_pt * end_pt * (top_left, top_right)  %Control points forming a rectangle. ;The two manufactured control points form the top corners,  so the supplied points map as start_point == bottom_left and  end_point == bottom_right.  :  - start_pt -> end_pt -> (top_left, top_right)  =Control points forming a square - side_len derived from the ( distance between start and end points. ;The two manufactured control points form the top corners,  so the supplied points map as start_point == bottom_left and  end_point == bottom_right.  :  3 start_pt -> end_pt -> (bottom_left, bottom_right)  =Control points forming a square - side_len derived from the ( distance between start and end points. As per  but the square is drawn   underneath3 the line formed between the start and end points. 2 (Underneath is modulo the direction, of course). -The two manufactured control points form the bottom corners,  so the supplied points map as start_point == top_left and  end_point == top_right.  :  G altitude * ratio_to_base * start_pt * end_pt -> (top_left, top_right)  ,Control points form an isosceles trapezoid. ;The two manufactured control points form the top corners,  so the supplied points map as start_point == bottom_left and  end_point == bottom_right.  :  9 altitude * start_pt * end_pt * (top_left, bottom_right)  ;Control points forming a square bisected by the line from  start_pt to end_pt. :The two manufactured control points form the top_left and 6 bottom_right corners, so the supplied points map as  start_point == bottom_left and end_point == top_right. ,GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>Connect with a straight line. :Right-angled connector - go vertical, then go horizontal. :Right-angled connector - go horizontal, then go vertical. 7Right-angled connector - go vertical for the supplied 5 distance, go horizontal, go vertical again for the  remaining distance. 9Right-angled connector - go horizontal for the supplied 4 distance, go verical, go horizontal again for the  remaining distance.  Triangular joint. u" is the altitude of the triangle. Double  triangular joint. u" is the altitude of the triangle. Lightning bolt' joint - a two joint connector with an axis + perpendicular to the connector direction. u( is the half length of the of the axis. ,Form a curve inside an isosceles triangle. 8The two Bezier control points take the same point - the ? altitude of the triangle. The curve tends to be quite shallow  relative to the altitude. u" is the altitude of the triangle. Form a curve inside a square. 'The two Bezier control points take the top corners. The  curve tends to be very deep. Form a curve inside a square. As per  but the curve is drawn  underneath 3 the line formed between the start and end points. 1(Underneath is modulo the direction, of course). altitude * ratio_to_base !Form a curve inside a trapeziod. =Make a curve within a square, following the corner points as  a Z. =Make a curve within a square, following the corner points as  a Z. =The order of tracing flips the control points, so this is an   underneath version of . 6GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>J !"#$%&'()*+,-./0123456789:;<=>?@A-GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>9*Encode an arrowhead as an image where the answer is the  retract distance. <The retract distance is context sensitive - usually just on ? the markHeight (or halfMarkHeight) so it has to be calculated  w.r.t. the DrawingCtx. Tiplen is length of the tip *along the line it follows*.  |\  | \  | /  |/   | | -- tip len 3Tip width is the distance between upper and lower  arrow points.  __  |\  | \ tip  | / width  |/ __  ;This one is for triangular tips defined by their tip angle  e.g. 90deg, 60deg, 45deg. :The tip width will be variable (tip length should be the  markHeight). <This one is for triangles when the tip height and tip width  are known. Tripoints takes the * tip length* is the mark height. ?This means that the 90deg tip has a tip width greater-than the = mark height (but that is okay - seemingly this is how TikZ  does it).      .GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>connector with no arrow heads. Same tip both ends. 7GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>&/GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com><The length of the control-point vector wants to be slighly  longer than half of d& (d - being the distance between the   truncated points and the corner). . throws a runtime error if the input list has  less than 3 eleemnts. %Two parts - line and corner curve... 0GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>  !"#$%&'()*+,-./1GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>01 Coordinate 23456 Note - the x is drawn  regardless of any scaling or rotation. 7892GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>-:;<=>?@ABCDEFGHIJ :  width * height -> shape   : ( round_length * width * height -> shape  KL :  radius -> shape  MNOPQ : # half_width * half_height -> shape  :Note - args might change to tull_width and full_height...  : 2 round_length * half_width * half_height -> shape  :Note - args might change to full_width and full_height... RSTUx_radius is the unit length.  :  x_radii * y_radii -> shape  VW8GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>$3GHC unstablestephen.tetley@gmail.com XYZ[\]^ _9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^e_`abcdefghijklmnopqrstuvwxyz{|}~U\             W Z                                      p      !"#$%&'()*+,-.SWVZ/01234556789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~             ! " # $!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:";"<"=">"?"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#Q#S#a#b#R#c#d#e#f#g#h#i#j#k$l%m&n&o&p&q&r&s&t&u&v&w&x&y&z&{&|&}&~'''''''''(((((((((((((())))))))))))))))))))**********************+++++++,,,,,,,,,,,,,,,,-------------------------------.......///00000000000 0 0 0 0 1111111222222222222 2!2"2#3$3%&'()T*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSzTUVWXYZ[P\]  ^ _ ` a  b c c d e fghijklmnopqrst uvwwxyz{|}~_ !!%!!&"##R#####################$$%%%&n&&&o&&&v&&&''((((((((((((((((((((((())))))***********************--------- - - - - -------------....... .!."/#/$/%/&/'0(0)0)0*0+0,00-0.0/0000100203041511611718191:1;1<2=2>2?22@2A22B2C2D22E2F2G22H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V3W3X3Y3Y3Z3[3$\wumpus-basic-0.14.0!Wumpus.Drawing.Turtle.TurtleClassWumpus.Drawing.Text.SafeFontsWumpus.Drawing.Paths.Base Wumpus.Drawing.Colour.X11Colours Wumpus.Drawing.Colour.SVGColoursWumpus.Basic.VersionNumber$Wumpus.Basic.Utils.FormatCombinators$Wumpus.Basic.Utils.ParserCombinatorsWumpus.Basic.Utils.TokenParsers-Wumpus.Basic.System.FontLoader.Base.GSFontMapWumpus.Basic.Utils.HList!Wumpus.Drawing.Paths.Construction"Wumpus.Basic.Kernel.Geometry.Paths)Wumpus.Basic.Kernel.Geometry.Intersection%Wumpus.Basic.Kernel.Base.GlyphMetrics-Wumpus.Basic.System.FontLoader.Base.Datatypes1Wumpus.Basic.System.FontLoader.Base.FontLoadMonad1Wumpus.Basic.System.FontLoader.Base.AfmParserBase3Wumpus.Basic.System.FontLoader.Base.AfmV4Dot1Parser/Wumpus.Basic.System.FontLoader.Base.AfmV2Parser'Wumpus.Basic.Kernel.Base.DrawingContext Wumpus.Basic.Kernel.Base.QueryDC!Wumpus.Basic.Kernel.Base.UpdateDC!Wumpus.Basic.Kernel.Base.BaseDefs#Wumpus.Basic.Kernel.Base.ContextFun)Wumpus.Basic.Kernel.Base.WrappedPrimitive'Wumpus.Basic.Kernel.Base.ScalingContext'Wumpus.Basic.Kernel.Objects.BaseObjects%Wumpus.Basic.Kernel.Objects.Connector#Wumpus.Basic.Kernel.Objects.Graphic*Wumpus.Basic.Kernel.Objects.AdvanceGraphic#Wumpus.Basic.Kernel.Objects.Bounded(Wumpus.Basic.Kernel.Objects.TraceDrawing Wumpus.Basic.Kernel.Base.Anchors#Wumpus.Basic.Kernel.Objects.Drawing"Wumpus.Basic.System.FontLoader.Afm*Wumpus.Basic.System.FontLoader.GhostScriptWumpus.Drawing.Chains.BaseWumpus.Drawing.Chains.DerivedWumpus.Drawing.Text.LRTextWumpus.Drawing.Dots.MarksWumpus.Drawing.Dots.AnchorDots"Wumpus.Drawing.Paths.ControlPointsWumpus.Drawing.Paths.ConnectorsWumpus.Drawing.Arrows.Tips Wumpus.Drawing.Arrows.Connectors!Wumpus.Drawing.Paths.RoundCornersWumpus.Drawing.Shapes.Base Wumpus.Drawing.Shapes.CoordinateWumpus.Drawing.Shapes.Derived!Wumpus.Drawing.Turtle.TurtleMonadWumpus.Basic.KernelWumpus.Drawing.ChainsWumpus.Drawing.PathsWumpus.Drawing.ArrowsWumpus.Drawing.ShapesTurtleMgetLocsetLoc getOrigin setOriginCoordsetsLocsetsLoc_resetLoc moveRightmoveLeftmoveUpmoveDownnextLine times_roman times_italic times_boldtimes_bold_italic helveticahelvetica_obliquehelvetica_boldhelvetica_bold_obliquecouriercourier_oblique courier_boldcourier_bold_obliquesymbolPathDPathPathOneL:<< PathViewL DPathViewLPathOneR:>> PathViewR DPathViewRLine1Curve1 PathSegment DPathSegmentlengthappendpconcatlinecurvepivottraceLinePointstraceCurvePoints curveByAngles toPrimPathtipLtipR shortenBothshortenLshortenR directionL directionRmidwaymidway_atstartatstart_atendatend_ pathViewL pathViewRantique_white1antique_white2antique_white3antique_white4 aquamarine1 aquamarine2 aquamarine3 aquamarine4azure1azure2azure3azure4bisque1bisque2bisque3bisque4blue1blue2blue3blue4brown1brown2brown3brown4 burlywood1 burlywood2 burlywood3 burlywood4 cadet_blue1 cadet_blue2 cadet_blue3 cadet_blue4 chartreuse1 chartreuse2 chartreuse3 chartreuse4 chocolate1 chocolate2 chocolate3 chocolate4coral1coral2coral3coral4 cornsilk1 cornsilk2 cornsilk3 cornsilk4cyan1cyan2cyan3cyan4dark_goldenrod1dark_goldenrod2dark_goldenrod3dark_goldenrod4dark_olive_green1dark_olive_green2dark_olive_green3dark_olive_green4 dark_orange1 dark_orange2 dark_orange3 dark_orange4 dark_orchid1 dark_orchid2 dark_orchid3 dark_orchid4dark_sea_green1dark_sea_green2dark_sea_green3dark_sea_green4dark_slate_gray1dark_slate_gray2dark_slate_gray3dark_slate_gray4 deep_pink1 deep_pink2 deep_pink3 deep_pink4deep_sky_blue1deep_sky_blue2deep_sky_blue3deep_sky_blue4 dodger_blue1 dodger_blue2 dodger_blue3 dodger_blue4 firebrick1 firebrick2 firebrick3 firebrick4gold1gold2gold3gold4 goldenrod1 goldenrod2 goldenrod3 goldenrod4green1green2green3green4 honeydew1 honeydew2 honeydew3 honeydew4 hot_pink1 hot_pink2 hot_pink3 hot_pink4 indian_red1 indian_red2 indian_red3 indian_red4ivory1ivory2ivory3ivory4khaki1khaki2khaki3khaki4lavender_blush1lavender_blush2lavender_blush3lavender_blush4lemon_chiffon1lemon_chiffon2lemon_chiffon3lemon_chiffon4 light_blue1 light_blue2 light_blue3 light_blue4 light_cyan1 light_cyan2 light_cyan3 light_cyan4light_goldenrod1light_goldenrod2light_goldenrod3light_goldenrod4 light_pink1 light_pink2 light_pink3 light_pink4 light_salmon1 light_salmon2 light_salmon3 light_salmon4light_sky_blue1light_sky_blue2light_sky_blue3light_sky_blue4light_steel_blue1light_steel_blue2light_steel_blue3light_steel_blue4 light_yellow1 light_yellow2 light_yellow3 light_yellow4magenta1magenta2magenta3magenta4maroon1maroon2maroon3maroon4medium_orchid1medium_orchid2medium_orchid3medium_orchid4medium_purple1medium_purple2medium_purple3medium_purple4 misty_rose1 misty_rose2 misty_rose3 misty_rose4 navajo_white1 navajo_white2 navajo_white3 navajo_white4 olive_drab1 olive_drab2 olive_drab3 olive_drab4orange1orange2orange3orange4 orange_red1 orange_red2 orange_red3 orange_red4orchid1orchid2orchid3orchid4 pale_green1 pale_green2 pale_green3 pale_green4pale_turquoise1pale_turquoise2pale_turquoise3pale_turquoise4pale_violet_red1pale_violet_red2pale_violet_red3pale_violet_red4 peach_puff1 peach_puff2 peach_puff3 peach_puff4pink1pink2pink3pink4plum1plum2plum3plum4purple1purple2purple3purple4red1red2red3red4 rosy_brown1 rosy_brown2 rosy_brown3 rosy_brown4 royal_blue1 royal_blue2 royal_blue3 royal_blue4salmon1salmon2salmon3salmon4 sea_green1 sea_green2 sea_green3 sea_green4 seashell1 seashell2 seashell3 seashell4sienna1sienna2sienna3sienna4 sky_blue1 sky_blue2 sky_blue3 sky_blue4 slate_blue1 slate_blue2 slate_blue3 slate_blue4 slate_gray1 slate_gray2 slate_gray3 slate_gray4snow1snow2snow3snow4 spring_green1 spring_green2 spring_green3 spring_green4 steel_blue1 steel_blue2 steel_blue3 steel_blue4tan1tan2tan3tan4thistle1thistle2thistle3thistle4tomato1tomato2tomato3tomato4 turquoise1 turquoise2 turquoise3 turquoise4 violet_red1 violet_red2 violet_red3 violet_red4wheat1wheat2wheat3wheat4yellow1yellow2yellow3yellow4 alice_blue antique_whiteaqua aquamarineazurebeigebisqueblackblanched_almondblue blue_violetbrown burlywood cadet_blue chartreuse chocolatecoralcornflower_bluecornsilkcrimsoncyan dark_blue dark_cyandark_goldenrod dark_gray dark_green dark_grey dark_khaki dark_magentadark_olive_green dark_orange dark_orchiddark_red dark_salmondark_sea_greendark_slate_bluedark_slate_graydark_slate_greydark_turquoise dark_violet deep_pink deep_sky_bluedim_graydim_grey dodger_blue firebrick floral_white forest_greenfuchsia gainsboro ghost_whitegold goldenrodgraygreen green_yellowgreyhoneydewhot_pink indian_redindigoivorykhakilavenderlavender_blush lawn_green lemon_chiffon light_blue light_coral light_cyanlight_goldenrod_yellow light_gray light_green light_grey light_pink light_salmonlight_sea_greenlight_sky_bluelight_slate_graylight_slate_greylight_steel_blue light_yellowlime lime_greenlinenmagentamaroonmedium_aquamarine medium_blue medium_orchid medium_purplemedium_sea_greenmedium_slate_bluemedium_spring_greenmedium_turquoisemedium_violet_red midnight_blue mintcream mistyrosemoccasin navajo_whitenavyold_laceolive olive_draborange orange_redorchidpale_goldenrod pale_greenpale_turquoisepale_violet_red papaya_whip peach_puffperupinkplum powder_bluepurplered rosy_brown royal_blue saddle_brownsalmon sandy_brown sea_greenseashellsiennasilversky_blue slate_blue slate_gray slate_greysnow spring_green steel_bluetantealthistletomato turquoisevioletwheatwhite whitesmokeyellow yellow_greenwumpus_basic_versionFormatformatDocSDocemptyshowsDoc<><+>vconcatseparatehcathsepvcattextcharintintegerintegralfloatdoublehex4spacecomma semicolonfill fillStringR fillStringL punctuateenclosesquotesdquotesparensbracketsbracesangleslparenrparenlbracketrbracketlbracerbracelangleranglelisttupled semiBracesindentwriteDoc ParseError CharResult CharParserParserResultOkayFail runParserrunParserEitherapplyfailure throwError lookaheadpeekeofequalssatisfyoneOfnoneOfchainl1chainr1chainlchainrchoicecountbetweenoption optionMaybe optionUnitskipOneskipMany skipMany1many1sepBysepBy1sepEndBy sepEndBy1manyTill manyTill1stringanyCharupperlowerletteralphaNumdigithexDigitoctDigitnewlinetab LexemeParserspaceLexemeParserspaceCharLexemeParsercommentLexemeParsercommentLineLexemeParsercommentMultiLexemeParserlexeme whiteSpaceoctBaseoctHaskhexBasenatural GSFontMapghostscript_versionghostscript_fontmap gsMetricsFile gsFontAliasgsVersionNumberghostscript_fontmap_8_54HemptyHwrapHconsHsnocHappendHunfoldrHveloHconcatHtoListH fromListHPathMrunPathexecPathtiplinetorlinetohlinevlinebeziertocurvetoverticalHorizontalhorizontalVertical rectanglePath diamondPath polygonPointsisoscelesTrianglePointsisoscelesTrianglePathequilateralTrianglePointsequilateralTrianglePathLineEqn PointSlope LineSegmentLS pointSlopelineEqn toLineEqn findIntersect intersectionrectangleLines polygonLines GlyphMetricsFontMetricsOps MetricsOpsget_bounding_box get_cw_tableget_cap_heightCharWidthTable CodePointFontNameemptyGlyphMetrics lookupFont insertFontmonospace_metrics FontPropsfp_bounding_boxfp_default_adv_vec fp_adv_vecs fp_cap_heightMonospaceDefaultsdefault_letter_bboxdefault_cap_heightdefault_char_widthAfmGlyphMetrics afm_char_codeafm_width_vector afm_char_nameAfmFile afm_encodingafm_letter_bboxafm_cap_heightafm_glyph_metrics GlobalInfoAfmKeyAfmBoundingBoxPSEncodingScheme PSCharCodeAfmUnitafmValue afmUnitScalebuildMetricsOps FontLoadIO FontLoadErr runFontLoadIOevalFontLoadIO loadError logLoadMsg promoteIO promoteEither runParserFLIO sequenceAllbuildAfmFontProps checkFontPath afmFileParserrunQuery textQuery getFontBBoxgetEncodingScheme getCapHeightcharBBoxmetric keyStringPair versionNumberstartCharMetricskeyName newlineOrEOF uptoNewlinenamename1seminumbercinthexIntoctIntafmV4Dot1Parser afmV2Parser DrawingCtxMaskDClocalizeDrawingContextFDrawingContext glyph_tablesfallback_metrics stroke_props font_props stroke_colour fill_colourline_spacing_factorstandardContextmetricsContextdefault_drawing_contextasksDCwithFontMetricstextAttr withTextAttr strokeAttrwithStrokeAttrfillAttr withFillAttr borderedAttrwithBorderedAttr getLineWidth getFontAttr getFontSize getFontFacebaselineSpacing markHeightmarkHalfHeightglyphBoundingBoxglyphHeightRange glyphHeightglyphCapHeight cwLookupTablemonoFontPointSize monoCharWidth monoTextWidthmonoTextLength monoCapHeightmonoLowerxHeightmonoDescenderDepthmonoAscenderHeightmonoTextDimensionsmonoMultiLineHeightmonoDefaultPaddingmonoVecToCenter lineWidththick ultrathickthincapButtcapRound capSquare joinMiter joinRound joinBevel dashPatternunit_dash_patternphasedphase doublegaps doubledashesfontAttrfontFacefontSize doublesizehalfsize swapColoursbothStrokeColourbothFillColour strokeColour fillColour PointSupplyMpositionMonUnitThetaPointDisplace PointDisplace AdvanceVecVAlignVRightVCenterVLeftHAlignHBottomHCenterHTopBimapbimapbimapLbimapROPlusoplusoconcatreplaceLreplaceRadvanceHadvanceVdisplace displaceVec displaceH displaceVdisplaceParalleldisplacePerpendicular DConnectorCF DLocThetaCFDLocCF ConnectorCF LocThetaCFLocCFCF2CF1CFrunCFrunCF1runCF2lift0R1lift0R2lift1R2 promoteR1 promoteR2apply1R1apply2R2apply1R2 drawingCtxqueryCtxlocCtxlocPoint locThetaCtx locThetaPoint locThetaAngconnCtx connStartconnEndatrotconnectchain1getPrimGraphic PrimGraphicHPrimtraceTraceM hprimToListsingleH primGraphic metamorphPrimcollectHscaleVecscalePtscaleYscaleXYDimXDimScalingM scale_in_y scale_in_xScalingContextScalingScalingT runScaling runScalingTregularScalingContextcoordinateScalingContextunitXunitY DrawingInfoLocDrawingInfoLocThetaDrawingInfoImageAns GraphicAnsImageLocImage LocThetaImageDImage DLocImageDLocThetaImage hyperlinkDConnectorImageConnectorImageDConnectorGraphicConnectorGraphicDLocThetaGraphicLocThetaGraphic DLocGraphic LocGraphicDGraphicGraphic intoImage intoLocImageintoLocThetaImagemoveStartPointmoveStartPointThetalocPath emptyLocPathemptyLocGraphic openStroke closedStroke filledPath borderedPathtextline rtextline escapedline rescapedline hkernline vkernlinestrokedEllipserstrokedEllipse filledEllipserfilledEllipseborderedEllipserborderedEllipse straightLinestraightLineBetween curveBetweenstrokedRectanglefilledRectangleborderedRectangle strokedCircle filledCircleborderedCircle strokedDisk filledDisk borderedDisk DAdvGraphic AdvGraphicmakeAdvGraphicextractLocGraphic runAdvGraphicadvplus advconcatDBoundedLocThetaGraphicBoundedLocThetaGraphicDBoundedLocGraphicBoundedLocGraphicDBoundedGraphicBoundedGraphiccenterOrthoBBoxemptyBoundedLocGraphicillustrateBoundedGraphicillustrateBoundedLocGraphic illustrateBoundedLocThetaGraphic TraceDrawing TraceDrawingT DTraceDrawingDTraceDrawingTrunTraceDrawingexecTraceDrawingevalTraceDrawingrunTraceDrawingTexecTraceDrawingTevalTraceDrawingTliftToPictureUliftToPictureMb mbPictureUquerydrawxdrawdrawidrawi_xdrawixdrawi_nodenodei RadialAnchor radialAnchorCardinalAnchor2 northeast southeast southwest northwestCardinalAnchornorthsoutheastwest CenterAnchorcenter northwards southwards eastwards westwardsnortheastwardssoutheastwardssouthwestwardsnorthwestwardsradialConnectorPointsDrawingDDrawing runDrawing runDrawingU drawTracing clipDrawing modifyDrawingoverundercentricnextToHnextToVatPoint centeredAtzconcathspacevspacevsepalignHalignV alignHSep alignVSephcatAvcatAhsepAvsepAloadAfmMetrics loadGSMetrics SequenceAlg BivariateAlgIterAlgIterStepAnaAlgStepDoneLocChainChainchain chainFromunchain bivariate iterationboundedpairOnXspairOnYs univariateX univariateY tableDown tableRight horizontalvertical horizontals verticalsrescale baseLeftLinebaseCenterLine baseRightLine rbaseLeftLinerbaseCenterLinerbaseRightLine ctrCenterLinebaseCenterEscCharmultiAlignLeftmultiAlignCentermultiAlignRightrmultiAlignLeftrmultiAlignCenterrmultiAlignRightmarkCharmarkText markHLine markVLinemarkXmarkPlus markCross markDiamond markFDiamond markBDiamondmarkDisk markSquare markCircle markPentagonmarkStar markAsterisk markOPlus markOCross markFOCross markTriangle DotAnchor DotLocImage DDotLocImagedotChardotTextdotHLinedotVLinedotXdotPlusdotCross dotDiamond dotFDiamonddotDisk dotSquare dotCircle dotPentagondotStar dotAsteriskdotOPlus dotOCross dotFOCross dotTrianglemidpointIsoscelesdblpointIsoscelesrectangleFromBasePointssquareFromBasePointsusquareFromBasePointstrapezoidFromBasePointssquareFromCornerPointsDConnectorPath ConnectorPathconnLine connRightVH connRightHV connRightVHV connRightHVH connIsoscelesconnIsosceles2connLightningBoltconnIsoscelesCurveconnSquareCurveconnUSquareCurveconnTrapezoidCurveconnZSquareCurveconnUZSquareCurve Arrowhead getArrowheadtri90tri60tri45otri90otri60otri45revtri90revtri60revtri45 orevtri90 orevtri60 orevtri45barb90barb60barb45 revbarb90 revbarb60 revbarb45perpbracketdiskTipodiskTip squareTip osquareTip diamondTip odiamondTipcurveTip revcurveTip Connector connector leftArrow rightArrowdblArrowleftrightArrowstrokeConnector cornerCurve roundEveryillustratePathShapeLocShapeShapeConstructorShapeCTM ShapeGeom makeShape borderedShape filledShape strokedShape makeShapeCTM runShapeGeomaskCTM shapeCenter shapeAngle projectPointCoordinateAnchorDCoordinateAnchor Coordinate DCoordinate coordinate coordinateDot coordinateX Rectangle DRectangleCircleDCircleDiamondDDiamondEllipseDEllipse rectangle rrectangle mkRectanglecirclediamondrdiamondellipseTurtleT runTurtleT _path_end_path_elements _path_start _path_length _line_end _line_start _line_lengthLineSeg _curve_end _ctrl_pt_two _ctrl_pt_one _curve_start _curve_lengthCurveSegPathSegCurve StrictCurve segmentLength segmentStart segmentEnd lineSegment curveLengthgravesenLengthctrlPolyLength cordLength pointMidpoint subdivide subdividetaffineCombination makeLeftPath shortenSegL shortenLineL makeRightPath shortenSegR shortenLineRIndentLineJoinDoc1unDocindentSrunDocbaseGHC.Real fromIntegralpadr getParserFKSKyieldalt eagerMany eagerSome<:>Control.ApplicativesomegetLexemeParser lineComment spanCommentendLinegetPathMSt current_pointpath_accsnoclineIntersectionResult NoIntersect Contained Intersects _line_eqn_A _line_eqn_B _line_eqn_C_point_slope_point_point_slope_slope quadrantCheck intersect1lineF affineCombgetGlyphMetrics getAfmUnit getFontLoadIO FontLoadLoggetFontLoadLogmessage1consextractCapHeightextractFontBBox globalInfofontBBoxlpcharMetricsV4Dot1 widthVector characterCode charMetricsV2 wumpus_blackwumpus_light_graywumpus_courier glyphQuery withFontSizemonoTotalCharHeightupdateStrokePropsupdateFontProps thick_lineultra_thick_line thin_line setLineCap setLineJoinunCF2unCF1unCFgetHPrim getScaling getScalingT graphicBodywumpus-core-0.41.0Wumpus.Core.Picture vectorPath emptyPathostrokecstroke fillStroke textlabel rtextlabel escapedlabel rescapedlabel hkernlabel vkernlabel strokeEllipsedrawWith bbrectanglegetTraceDrawinggetTraceDrawingT extendPtDist getDrawing boundaryExtr boundaryCtr boundaryN boundaryS boundaryE boundaryW boundaryNW boundaryNE boundarySW boundarySEboundaryLeftEdgeboundaryRightEdgeboundaryBottomEdgeboundaryTopEdge empty_drawing drawingConcat mbpostcomb megaCombRmove alignMove alignMove2afmLoadFontCalcsafm_mono_defaults_4_1gsLoadFontCalcsresolveFontFileghostscript_mono_defaults_8_54 initial_st iter_stepst_zerogen_stepgetChainscaledBivariatePtscaledBivariateVecdownstep rightstep DisplaceFunBoundedLocThetaOnelineLocThetaDrawOneline OnelineTextdrawLeftAligneddrawCenterAligneddrawRightAligned onelineBBoxmakeMoveableLine onelineAlgcenterToCenter leftToCenter rightToCenter multilineTEXT zipMultis centralPoints trailPointslinesToInterims avMaxWidthonelineEscText textVector charWidthrenderPathWith axialLine pathDiamond markBCircle starLines asteriskLinescardinal_anchor radial_anchor center_anchorNNNEEESESSSWWWNWCardinalradialCardinal rectCardinal polyCardinalrectangleAnchor polygonAnchorbboxRectAnchor rectangleLDO circleAnchor circleLDO polygonLDOtriVecsByAngle triVecsByDistmarkHeightLessLineWidth noRetracttipBodytripointsByAnglerevtripointsByAngletripointsByDistrevtripointsByDisttriTLG revtriTLGbarbTLG revbarbTLGperpTLG rperpPath bracketTLG rbracketPathdiskTLG squareTLG rsquarePath diamondTLG rdiamondPathcurveTLG cxCurvePath revcurveTLGcxRevcurvePath ArrowMarkconnector_pathopt_left_arrowopt_right_arrow shortenPathtipEvalunmarkedmakeMarktwoParts drawPathBoth drawPath1 bezierCtrl pathPoint getShapeRShapeRcons_funpath_fun shape_ctm ctm_rotation ctm_scale_y ctm_scale_x ctm_center getShapeGeom runShapeR shapeImage updateCTMgetCoordAnchor getCoordinate LocCoordinate runCoordinatecMapquarterMarkHeightdrawDotdrawXrect_hhrect_hwrect_ctm circ_radiuscirc_ctmdia_hhdia_hwdia_ctmell_ryell_rxell_ctm runRectanglerectangleIntersectrectanglePoints runCirclemkCircle circlePoints runDiamonddiamondIntersectmidpoint mkDiamond diamondPoints runEllipsescaleEll mkEllipse ellipsePoints_current_coord_turtle_origin TurtleStateTurtleScalingT getTurtleT