h      !"#$%&'()*+,-./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 { | } ~                                                                                                                                                                   ! " # $ % & ' ( ) * + , - . / 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 { | } ~                                                                     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ~     !!!!!!!!!!!!!!!""""""'GHCunstablestephen.tetley@gmail.com0:Vertical alignment - align to the left, center or bottom. ;Horizontal alignment - align to the top, center or bottom. The center of a picture.    a `over` b Place 'picture' a over b. The idea of over here is in = terms z-ordering, nither picture a or b are actually moved.   a `under` b  Similarly under! draws the first picture behind  the second but move neither. under was previously beneath. *Move in both the horizontal and vertical. Extract the top-left corner. Extract the top-right corner.  Extract the bottom-left corner. !Extract the bottom-right corner.  2Draw a centered over b - a is moved, b is static.   a `centerOver` b   was previously the (-@ -) operator.   a `nextToH` b Horizontal composition - move b, placing it to the right  of a.  $ was previously the (->-) operator.   a `nextToV` b Vertical composition - move b, placing it below a. nextToV was previously the (- -) operator. )Place the picture at the supplied point.  was previous the at operator. *Center the picture at the supplied point.   xs `stackOver` x Stack the list of pictures xs   x. >Note, the first picture in the list is drawn at the top, all $ the pictures in the list are drawn 'over' x. No pictures  are moved  [p1,p2,p3]  p4 => [p1,p2,p3,p4]  x `zconcat` xs  Concatenate x over the list of pictures xs. x. is drawn at the top. No pictures are moved.  p1  [p2,p3,p4] => [p1,p2,p3,p4]Concatenate the list pictures xs horizontally with nextToH  starting at x. !Concatenate the list of pictures xs vertically with nextToV  starting at x. 9Stack pictures centered ontop of each other - the first > picture in the list is drawn at the top, last picture is on  drawn at the bottom.   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 x xs !Concatenate the list of pictures xs horizontally with  hspace starting at x&. The pictures are interspersed with  spaces of n units.   vsep n x xs !Concatenate the list of pictures xs vertically with  vspace starting at x&. The pictures are interspersed with  spaces of n units.   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.   alignV align a b Vertical composition - move b, placing it below a 0 and align it with the left, center or right of a.   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.   alignHSep align sep a b !Spacing version of alignV - move b below a  separated by sep units, align b according to align.  Variant of % that aligns the pictures as well as  concatenating them.  Variant of % that aligns the pictures as well as  concatenating them.  Variant of hsep% that aligns the pictures as well as ! concatenating and spacing them.  Variant of vsep% that aligns the pictures as well as ! concatenating and spacing them. !  !  !  GHCunstablestephen.tetley@gmail.com!Version number  (0,12,0) !!!GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>K"#$%&'()*+,-./012345 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. 66- throws a runtime error if the supplied list  is empty. 77) 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. 7- throws a runtime error if the supplied list @ is has less than 4 elements (start, control1, control2, end). 89'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... :;<Shorten both ends... +u should be less-than half the path length =+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. >,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. ?/Direction of empty path is considered to be 0. @/Direction of empty path is considered to be 0. ABCDEFGH'"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH'/.0123456789:;<=>?@ABCDEF+-,*')(&#%$"GH'"#%$$%&')(()*+-,,-./0123456789:;<=>?@ABCDEFGHGHC unstablestephen.tetley@gmail.comIJKLMNOPQRSTUVIJKLMNOPQRSTUVNIJKLMOPQSRTUVIJKLMJKLMNOPQRSTUVGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> W Times-Roman X Times Italic Y Times Bold ZTimes Bold Italic [ Helvetica \Helvetica Oblique ]Helvetica Bold ^Helvetica Bold Oblique _Courier `Courier Oblique a Courier Bold bCourier Bold Oblique cSymbol ?Note - Symbol does not appear to be well supported by some SVG @ renders. Seemingly Chrome is fine but Firefox defaults to some  serif font. WXYZ[\]^_`abc WXYZ[\]^_`abc WXYZ[\]^_`abcGHCunstablestephen.tetley@gmail.com defghijk6velo consumes the list as per map, but builds it back , as a Hughes list - so items can be dropped  replaced, repeated, etc... lmn defghijklmn defghijklmn defghijklmnGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>opqrstuvwxyz opqrstuvwxyz opqrstuvwxyz opqrstuvwxyzGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>{Line in equational form, i.e. Ax + By + C = 0. |}~:Calculate the counter-clockwise angle between two points  and the x-axis. {|}~ }~|{ {|}~~ GHCunstable)Stephen Tetley <stephen.tetley@gmail.com>8      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~8      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~8      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~8      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ GHCunstable)Stephen Tetley <stephen.tetley@gmail.com>      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>*RSTUVWXYZ[\Set the line width to a thick. Note this context update is  oblivious - operationally the  line width is set to exactly 2.0. ]^_`abcdefghijklm<Set the font size to double the current size, note the font 7 size also controls the size of dots, arrowsheads etc. n: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. opqrs"RSTUVWXYZ[\]^_`abcdefghijklmnopqrs"STUVWXYRZ[\]^_`abcdefghijlkmnopqrs"RSTUVWXYTUVWXYZ[\]^_`abcdefghijklmnopqrs GHCunstablestephen.tetley@gmail.com tuvwxyz{|} tuvwxyz{|} tuvwxyz{|} tuvwxyz{|} GHC highly unstablestephen.tetley@gmail.comD~A function from Radian -\> Point -\> Graphic... 8ConnectorImage 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. ,Images return a value as well as drawing. A node is a ; typical example - nodes are drawing but the also support  taking anchor points. ;Commonly graphics take a start point as well as a drawing  context. ?Here they are called a LocGraphic - graphic with a (starting)  location. *Drawings in Wumpus-Basic have an implicit graphics state  the DrawingContext(, the most primitive building block is @ a function from the DrawingContext to some polymorphic answer. 2This functional type is represented concretely as DrawingR. " DrawingR :: DrawingContext -> a Point transformation function. =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. 4A monad that supplies points, e.g. a turtle monad. 9Collect elementary graphics as part of a larger drawing. 'TraceM works much like a writer monad. ;DUnit is always for fully saturated type constructors, so = (seemingly) an equivalent type family is needed for monads. A Semigroup class. "Project a value out of a context. Run a Drawing Function with the supplied Drawing Context. ?~@~?~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). %Run the Drawing generating a Picture within a  "font delta context"& using the font-family and font-size ! from the intial DrawingContext. Using a font delta context! can reduce the code size of the 2 generated SVG file (PostScript ignores the FDC). exec version of  runFdcContext. Transformer version of . Transformer version of . 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>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. Height of a lower case 'x' in Courier. 'x'" has no ascenders or descenders. =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. #The default padding is half of the  char width. $Vector from baseline left to center GHC highly unstablestephen.tetley@gmail.com%As  but the supplied point is the center. <Centered is inexact - it is calculated with monospaced font  metrics. 8Point is the baseline left of the bottom line, text is  left-aligned. Supplying a point to a  CFGraphic takes it to a regular  . Supplied point is  bottom-left.  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. =For stroked circles that can be scaled, consider making the  circle from Bezier curves. $     $     $     GHCunstablestephen.tetley@gmail.com Scaling...  !"#$ !"#$ !"#$ !"#$#GHC highly unstablestephen.tetley@gmail.comRSTUVWXYZ[\]^_`abcdefghijklmnopqrs~      !"#$GHC unstablestephen.tetley@gmail.com%&'5IterAlg 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. ()6Chains 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. *+,-./012345%&'()*+,-./012345-,./0)+*'(&1%2345%&'(()+**+,-./012345GHC unstablestephen.tetley@gmail.com 6789:;<=> 6789:;<=> 6789:;<=> 6789:;<=>$GHC unstablestephen.tetley@gmail.com%&'()*+,-./0123456789:;<=>GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> : ' num_points * radius * center -> [point]  ?@Supplied point is the center. ABCDEFGHINote disk is filled. JKLMNOPQ?@ABCDEFGHIJKLMNOPQ?@ABCDEFGHIJKLMNOPQ?@ABCDEFGHIJKLMNOPQGHC unstablestephen.tetley@gmail.com R     SIJKLMNOPQRSTUVRSRSRSGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>TT :  ( 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. UU :  : 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. VV :  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. WW :  - 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. XX :  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 W 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. YY :  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. ZZ :  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. TUVWXYZTUVWXYZTUVWXYZGHChighly 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. a9Right-angled connector - go horizontal for the supplied 4 distance, go verical, go horizontal again for the  remaining distance. b Triangular joint. u" is the altitude of the triangle. cDouble  triangular joint. u" is the altitude of the triangle. dLightning bolt' joint - a two joint connector with an axis + perpendicular to the connector direction. u( is the half length of the of the axis. e,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. fForm a curve inside a square. 'The two Bezier control points take the top corners. The  curve tends to be very deep. gForm a curve inside a square. As per f but the curve is drawn  underneath 3 the line formed between the start and end points. 1(Underneath is modulo the direction, of course). haltitude * ratio_to_base !Form a curve inside a trapeziod. i=Make a curve within a square, following the corner points as  a Z. j=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 i. [\]^_`abcdefghij\[]^_`abcdefghij[\]^_`abcdefghij%GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>J"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHopqrstuvwxyzTUVWXYZ[\]^_`abcdefghijGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>k<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). ll. throws a runtime error if the input list has  less than 3 eleemnts. %Two parts - line and corner curve... mklmkmlklmGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>nopqr !"#s$tuv%wxyz{nopqrstuvwxyz{rqsptuvownxy{znopqrstuvwxyz{GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>|&'()*+,-./01}~2345678 |}~ |}~ |}~GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>Note - prints as 'A'. Note - prints as 'B'. Note - prints as 'X'. Note - prints as 'E'. Note - prints as 'H'. +Note - does not appear to print in Chrome. Note - prints as 'I'. Note - prints as 'K'. Note - prints as 'M'. Note - prints as 'N'. Note - prints as 'Y'. Note - this is the pretty Upsilon.       !"#$%&'()*      !"#$%&'()*      !"#$%&'()*      !"#$%&'()*GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>2+*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. ,-9Tiplen 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). >?@A./0123B456789C:;<D=>?E@FAGBCHDEIFGJHKI+,-./0123456789:;<=>?@ABCDEFGHI+,-./0123456789:;<=>?@ABCDEFGHI+,-,-./0123456789:;<=>?@ABCDEFGHIGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>JLMNOKconnector with no arrow heads. LMNSame tip both ends. OPPQRJKLMNOPJKLMNOPJKLMNOP&GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>&+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>Q:Anchor on a border that can be identified with and angle. RSTUVWXYZ[\]^S_`abcdefgQRSTUVWXYZ[\]^_`abcdefg]^XYZ[\STUVWQR_`abcdefgQRRSTUVWTUVWXYZ[\YZ[\]^^_`abcdefgGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>(hiTUVWXYZ[\j]^_`abcdefklmnopqrstuvwxyz{|hijklmnopqrstuvwxyz{|jihklmnopqrstuvwxyz{|hijklmnopqrstuvwxyz{| GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> }~gh Coordinate ijkl}~~}}~!GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>-mnopqrstuvwxyz{|} :  width * height -> shape   : ( round_length * width * height -> shape  ~ :  radius -> shape   : # 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... x_radius is the unit length.  :  x_radii * y_radii -> shape  "GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>'GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>(nopqrstuvwxyz{}~()*+,-./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 { | } ~                                                                                                                                                                   ! " # $ % & ' ( ) * + , - . / 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 { { | } ~                                                                                                           !"#$%&'()*+,-./0123456789:;;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !!!!!!!!!!!!!!!""""""W                9 : KLSx !"#$%&'()*+,-../01234456789:;<=>?@ABCDEFGHIJKLMNOPQRSnTUVWXYZ[\]^_`abcdefghijkl  m  n o p!!q!r!s!!t!u!v!!w!x!!y!z!{!|!}!~!!!!!!!!!!!!"""""""""""wumpus-basic-0.12.0Wumpus.Basic.PictureLanguageWumpus.Basic.VersionNumberWumpus.Basic.Paths.BaseWumpus.Basic.Monads.TurtleClassWumpus.Basic.SafeFontsWumpus.Basic.Utils.HListWumpus.Basic.Paths.ConstructionWumpus.Basic.Utils.IntersectionWumpus.Basic.Colour.X11ColoursWumpus.Basic.Colour.SVGColours#Wumpus.Basic.Graphic.DrawingContextWumpus.Basic.Utils.CombinatorsWumpus.Basic.Graphic.BaseWumpus.Basic.Graphic.DrawingWumpus.Basic.Graphic.Query Wumpus.Basic.Graphic.PrimGraphic#Wumpus.Basic.Graphic.ScalingContextWumpus.Basic.Chains.BaseWumpus.Basic.Chains.DerivedWumpus.Basic.Dots.MarksWumpus.Basic.Monads.TurtleMonad Wumpus.Basic.Paths.ControlPointsWumpus.Basic.Paths.ConnectorsWumpus.Basic.Paths.RoundCornersWumpus.Basic.Shapes.BaseWumpus.Basic.Text.LRTextWumpus.Basic.Text.LRSymbolWumpus.Basic.Arrows.TipsWumpus.Basic.Arrows.ConnectorsWumpus.Basic.AnchorsWumpus.Basic.Dots.AnchorDotsWumpus.Basic.Shapes.CoordinateWumpus.Basic.Shapes.DerivedWumpus.Basic.Shapes.PlaintextWumpus.Basic.GraphicWumpus.Basic.ChainsWumpus.Basic.PathsWumpus.Basic.ArrowsWumpus.Basic.ShapesVAlignVRightVCenterVLeftHAlignHBottomHCenterHTop centerPointoverunder centerOvernextToHnextToVatPoint centeredAt stackOverzconcathcatvcatstackOverCenterhspacevspacehsepvsepalignHalignV alignHSep alignVSephcatAvcatAhsepAvsepAwumpus_basic_version DPathSegment PathSegmentCurve1Line1 DPathViewR PathViewR:>>PathOneR DPathViewL PathViewL:<<PathOneLDPathPathlengthappendpconcatlinecurvepivottraceLinePointstraceCurvePoints curveByAngles toPrimPathtipLtipR shortenBothshortenLshortenR directionL directionRmidwaymidway_atstartatstart_atendatend_ pathViewL pathViewRTurtleMgetLocsetLoc getOrigin setOriginCoordsetsLocsetsLoc_resetLoc moveRightmoveLeftmoveUpmoveDownnextLine times_roman times_italic times_boldtimes_bold_italic helveticahelvetica_obliquehelvetica_boldhelvetica_bold_obliquecouriercourier_oblique courier_boldcourier_bold_obliquesymbolHemptyHwrapHconsHsnocHappendHunfoldrHveloHconcatHtoListH fromListHPathMrunPathexecPathtiplinetorlinetohlinevlinebeziertocurvetoverticalHorizontalhorizontalVerticalLineEqn PointSlope LineSegmentLS pointSlopelineEqn toLineEqn findIntersect intersectionrectangleLines polygonLineslangleantique_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_greenDrawingContextFDrawingContext stroke_props font_props stroke_colour fill_colourline_spacing_factorstandardContextdefault_drawing_contextthick ultrathickthincapButtcapRound capSquare joinMiter joinRound joinBevel dashPatternunit_dash_patternphasedphase doublegaps doubledashesfontfacefontsize doublesizehalfsize swapColoursbothStrokeColourbothFillColour strokeColour fillColourforkprodforkAbindRbindAskbindIntorlift1bindR2 bindAskR2rlift2DThetaLocImage ThetaLocImageDThetaLocGraphicThetaLocGraphicDThetaLocDrawingRThetaLocDrawingRDConnectorImageConnectorImageDConnectorGraphicConnectorGraphicDConnectorDrawingRConnectorDrawingR DLocImageLocImage ImageTrafoFDImageImage DLocGraphic LocGraphic GraphicTrafoFDGraphicGraphic PrimGraphicgetPrimGraphic DrawingTrafoF DLocDrawingR LocDrawingRDrawingRDPoint2FPoint2FHPrim PointSupplyMposition DrawingCtxMaskDClocalizeTraceMtraceMonUnitOPlusoplusoconcatanteriorsuperiorasksDC hprimToListsingleH runDrawingRwrapPrimcollectH runGraphic xlinkGraphicanteriorGraphicsuperiorGraphicrunImage intoImageintoImageTrafoimageTrafoDrawingimageTrafoGraphic intoLocImage xlinkImageintoConnectorImageintoThetaLocImageDrawingTDrawing runDrawing execDrawing evalDrawing runDrawingT execDrawingT evalDrawingT runFdcDrawingexecFdcDrawingrunFdcDrawingTexecFdcDrawingTliftToPictureUliftToPictureMb mbPictureUdrawxdrawdrawidrawi_xdrawixdrawi_atnodenodeitextAttr withTextAttr strokeAttrwithStrokeAttrfillAttr withFillAttr borderedAttrwithBorderedAttr lineWidthfontSizebaselineSpacing markHeightmarkHalfHeight monoCharWidthmonoSpacerWidth monoTextWidthmonoTextLengthmonoTextHeightmonoNumeralHeightmonoLowerxHeightmonoDescenderDepthmonoTextDimensionsmonoMultiLineTextHeightmonoDefaultPaddingmonoVecToCenter drawGraphic openStroke closedStroke filledPath borderedPathtextline rtextlinecentermonoTextline textlineMulti hkernline vkernlinestrokedEllipse filledEllipseborderedEllipsesupplyPt vecdisplacedisplace hdisplace vdisplace parallelvecperpendicularvecdisplaceParalleldisplacePerpendicular localPoint straightLinestraightLineBetween curveBetweenstrokedRectanglefilledRectangleborderedRectangle strokedCircle filledCircleborderedCircle strokedDisk filledDisk borderedDiskScalingTScalingScalingContext scale_in_x scale_in_yScalingMXDimYDimscaleXscaleYscalePtscaleVec runScaling runScalingTregularScalingContextcoordinateScalingContextunitXunitY SequenceAlg BivariateAlgIterAlgIterStepAnaAlgStepDoneLocChainChainchain chainFromunchain bivariate iterationboundedpairOnXspairOnYs univariateX univariateY tableDown tableRight horizontalvertical horizontals verticalsrescalemarkCharmarkText markHLine markVLinemarkXmarkPlus markCross markDiamond markFDiamond markBDiamondmarkDisk markSquare markCircle markPentagonmarkStar markAsterisk markOPlus markOCross markFOCrossTurtleT runTurtleTmidpointIsoscelesdblpointIsoscelesrectangleFromBasePointssquareFromBasePointsusquareFromBasePointstrapezoidFromBasePointssquareFromCornerPointsDConnectorPath ConnectorPathconnLine connRightVH connRightHV connRightVHV connRightHVH connIsoscelesconnIsosceles2connLightningBoltconnIsoscelesCurveconnSquareCurveconnUSquareCurveconnTrapezoidCurveconnZSquareCurveconnUZSquareCurve cornerCurve roundEveryillustratePath ShapeGeomShapeCTMShapeConstructorLocShapeShape makeShape borderedShape filledShape strokedShape makeShapeCTM runShapeGeomaskCTM shapeCenter projectPointLRText runLRText execLRTextkerncharescIntescNamesymb symbEscInt symbEscNameuAlphauBetauChiuDeltauEpsilonuEtauEurouGamma uIfrakturuIotauKappauLambdauMuuNuuOmegauOmicronuPhiuPiuPsi uRfrakturuRhouSigmauTauuThetauUpsilon uUpsilon1uXiuZetaalphabetagammadeltaepsilonzetaetathetaiotakappalambdamunuxipirhosigmatauupsilonphichipsiomegaaleph ampersandangle angleleft angleright approxequal arrowboth arrowdblboth arrowdbldown arrowdblleft arrowdblright arrowdblup arrowdown arrowleft arrowrightarrowup asteriskmathbar braceleft braceright bracketleft bracketrightbulletcarriagereturncirclemultiply circleplusclubcoloncomma congruent copyrightsanscopyrightserifdegreediamonddividedotmatheightelementellipsisemptysetequal equivalenceexclam existentialfiveflorinfourfractiongradientgreater greaterequalheartinfinityintegralless lessequal logicaland logicalnot logicalorlozengeminusminutemultiplynine notelementnotequal notsubset numbersignomega1omicronone parenleft parenright partialdiffpercentperiod perpendicularphi1plus plusminusproduct propersubsetpropersuperset proportionalquestionradical radicalex reflexsubsetreflexsuperset registersans registerserifsecond semicolonsevensigma1similarsixslashspacespadesuchthat summation thereforetheta1three trademarksanstrademarkseriftwo underscoreunion universal weierstrasszero Arrowhead getArrowheadtri90tri60tri45otri90otri60otri45revtri90revtri60revtri45 orevtri90 orevtri60 orevtri45barb90barb60barb45 revbarb90 revbarb60 revbarb45perpbracketdiskTipodiskTip squareTip osquareTip diamondTip odiamondTipcurveTip revcurveTip Connector connector leftArrow rightArrowdblArrowleftrightArrowstrokeConnector RadialAnchor radialAnchorCardinalAnchor2 northeast southeast southwest northwestCardinalAnchornorthsoutheastwest CenterAnchorcenter northwards southwards eastwards westwardsnortheastwardssoutheastwardssouthwestwardsnorthwestwardsradialConnectorPoints DDotLocImage DotLocImage DotAnchordotChardotTextdotHLinedotVLinedotXdotPlusdotCross dotDiamond dotFDiamonddotDisk dotSquare dotCircle dotPentagondotStar dotAsteriskdotOPlus dotOCross dotFOCross DCoordinate CoordinateDCoordinateAnchorCoordinateAnchor coordinatecoordinateMarkDEllipseEllipseDDiamondDiamondDCircleCircle DRectangle Rectangle rectangle rrectangle mkRectanglecirclerdiamondellipse DPlaintext PlaintextDPlaintextAnchorPlaintextAnchor plaintextdrawText rightBound leftBound bottomBoundtopBoundmovetoplefttopright bottomleft bottomrightleftmidrightmidtopmid bottommidmidptvecMove StrictCurveCurvePathSegCurveSeg _curve_length _curve_start _ctrl_pt_one _ctrl_pt_two _curve_endLineSeg _line_length _line_start _line_end _path_length _path_start_path_elements _path_end segmentLength segmentStart segmentEnd lineSegment curveLengthgravesenLengthctrlPolyLength cordLength pointMidpoint subdivide subdividetaffineCombination makeLeftPath shortenSegL shortenLineL makeRightPath shortenSegR shortenLineRgetPathMSt current_pointpath_accsnoclineIntersectionResult NoIntersect Contained Intersects _line_eqn_A _line_eqn_B _line_eqn_C_point_slope_point_point_slope_slope quadrantCheck intersect1lineF affineCombupdateStrokePropsupdateFontProps thick_lineultra_thick_line thin_line setLineWidth setLineCap setLineJoin getDrawingRgetHPrim getDrawingT getDrawing withFontSize getScalingT getScaling initial_st iter_stepst_zerogen_stepgetChainscaledBivariatePtscaledBivariateVecdownstep rightstep polygonPoints shiftOrigin axialLine pathDiamond markBCircle getTurtleTTurtleScalingT TurtleState_turtle_origin_current_coordtwoParts drawPathBoth drawPath1 bezierCtrl pathPoint getShapeGeom ctm_center ctm_scale_x ctm_scale_y ctm_rotation shape_ctmpath_funcons_funShapeR getShapeR runShapeR shapeImage updateCTM getLRTextEnv char_width spacer_width delta_chr delta_symacc_chracc_symenvZerogetscharMovesymbMovesnocSymbsnocChartriVecsByAngle triVecsByDistmarkHeightLessLineWidth noRetracttripointsByAnglerevtripointsByAngletripointsByDistrevtripointsByDisttriTLG revtriTLGbarbTLG revbarbTLGperpTLG bracketTLGdiskTLG squareTLG diamondTLGcurveTLG revcurveTLGconnector_pathopt_left_arrowopt_right_arrow shortenPathtipEvalunmarked extendPtDistCardinalNWWWSWSSSEEENENN center_anchor radial_anchorcardinal_anchorradialCardinal rectCardinalrectangleAnchor rectangleLDO circleAnchor circleLDO getCoordinatecoord_xcoord_y drawCoordell_ctmell_rxell_rydia_ctmdia_hwdia_hhcirc_ctm circ_radiusrect_ctmrect_hwrect_hh runRectanglerectangleIntersectrectanglePoints runCirclemkCircle circlePoints runDiamonddiamondIntersectmidpoint mkDiamond diamondPoints runEllipsescaleEll mkEllipse ellipsePoints text_texttext_xtext_ytext_ang getPlaintexttextCTM oneLineRect drawOneLine rotTextline