^v      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                  ! " # $ % & ' ( ) * +,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./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${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%%%%%%&&''((((()GHCunstablestephen.tetley@gmail.com Safe-InferedVersion number  (0,24,0)  Safe-Infered 'Convert a join list to a regular list. 'Build a join list from a regular list.  This builds a tall skinny list. )WARNING - throws an error on empty list. Create an empty join list. Create a singleton join list. /Cons an element to the front of the join list. .Snoc an element to the tail of the join list. =Extract the first element of a join list - i.e. the leftmost ? element of the left spine. An error is thrown if the list is  empty. <This function performs a traversal down the left spine, so  unlike head2 on regular lists this function is not performed  in constant time. 8This function throws a runtime error on the empty list. #Access the left end of a sequence. <Unlike the corresponing operation on Data.Sequence this is = not a cheap operation, the joinlist must be traversed down + the left spine to find the leftmost node. :Also the traversal may involve changing the shape of the  underlying binary tree. $Access the right end of a sequence. <Unlike the corresponing operation on Data.Sequence this is = not a cheap operation, the joinlist must be traversed down + the left spine to find the leftmost node. :Also the traversal may involve changing the shape of the  underlying binary tree. #     GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered*This one is from Chris Okasaki's "Even Higher-Order  Functions for Parsing". +;Peek tries the supplied parse, but does not consume input  ** even when the parse succeeds **. >>" an alias for Control.Applicative . : !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ5 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ5 !#"$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ8 !#"$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-InferedR;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. S#Build a lexeme parser that handles space. Space' is zero or more elements matching the isSpace  predicate from  Data.Char. T-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. U;Build a lexeme parser that handles start-and-end delimited  comments and arbitrary space. V;Build a lexeme parser that handles line spanning comments  an arbitrary space. W;Build a lexeme parser that handles start-and-end delimited ' comments, line comments and arbitrary space. X<Wrap a CharParser with a lexeme parser, the CharParser will : consume trailing space according to the strategy of the  LexemeParser. RSTUVWXYZ[\]^_RSTUVWXYZ[\]^_RSTUVWXYZ[\]^_RSTUVWXYZ[\]^_GHCunstablestephen.tetley@gmail.com Safe-Inferedg6velo consumes the list as per map, but builds it back , as a Hughes list - so items can be dropped  replaced, repeated, etc... `abcdefghijk `abcdefghijk `abcdefghijk `abcdefghijkGHC highly unstablestephen.tetley@gmail.com Safe-Inferedl4Utility datatype representing orientation within a  rectangular frame*. RectPos is useful for graphics such as > text where the start point is not necessarily at the center  (or bottom left).  E x_minor is the horizontal distance from the left to the start point  F x_major is the horizontal distance from the start point to the right  E y_minor is the vertical distance from the bottom to the start point  B y_major is the vertical distance from the start point to the top "Values should be not be negative! r?Datatype enumerating the addressable positions of a rectangle  that can be derived for a  PosObject. :The positions are the compass points, plus the geometric - center, origin and the baseline positions:   BLL - baseline-left   BLC - baseline-center  BLR - baseline-right The vector from a origin ro a r. 2Calculate the bounding box formed by locating the l  at the supplied point. Height of the orientation. Height of the orientation. 0Rotate an Orientation about its origin (locus). Second Orientation is moved  to the right of the first along  the spine i.e the baseline. Second Orientation is moved below the first along the spine @ i.e. the vertical point between the left minor and right major * (not the same as the horizontal center). xmin and xmaj same as left. xmin same as left. xmin and ymaj same as left. 5Align second below - xmin and ymaj are same as left. (Align second below - ymaj same as left. 5Align second below - xmaj and ymaj are same as left. Move second right. Move second below. %Concatenation coalesces the origins. 7lmnopqrstuvwxyz{|}~5lmnopqrstuvwxyz{|}~5r~}|{zyxwvutslmnopq%lmnopqr ~}|{zyxwvutsGHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered !Anchors in the center of a side. ;Sides are addressable by index. Following TikZ, side 1 is @ expected to be the top of the shape. If the shape has an apex A instead of a side then side 1 is expected to be the first side  left of the apex. >Implementations are also expected to modulo the side number, + rather than throw an out-of-bounds error. 9Anchors at the bottom left and right corners of a shape. 6Anchors at the top left and right corners of a shape. >For some shapes (Rectangle) the TikZ convention appears to be 5 have cardinals as the corner anchors, but this doesn't seem @ to be uniform. Wumpus will need to reconsider anchors at some  point... 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  for the diagonal positions. =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 ; problematic, hence the compass points are split into two  classes. ,Cardinal (compass) positions on an object. @Cardinal anchors should be at their equivalent radial position. ? However, some shapes may not be able to easily define radial A positions or may be able to provide more efficient definitions B for the cardinal anchors. Hence the redundancy seems justified. Apex of an object. Center of an object. !Note an Anchor is just a Point2.  : ' extract_func * dist * object -> Point  <Derive a anchor by projecting a line from the center of an : object through the intermediate anchor (produced by the ? extraction function). The final answer point is located along - the projected line at the supplied distance dist. <E.g. take the north of a rectangle and project it 10 units  further on:   projectAnchor north 10 my_rect ?If the distance is zero the answer with be whatever point the # the extraction function produces. :If the distance is negative the answer will be along the B projection line, between the center and the intermediate anchor. @If the distance is positive the anchor will be extend outwards  from the intermediate anchor.  : + 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 highly unstablestephen.tetley@gmail.com Safe-Infered<Collected primitives - this type is effectively an analogue  to a Frame in Wumpus-Core. 3This type is essentially internal to Wumpus-Basic. A wrapped version of  from Wumpus-Core that  supports Monoid. Note that CatPrim provides a  single-object that can be  hyperlinked or whatever. It is different to # which is intended as a list type > with efficient concatenation to support building of multiple  Primitives in a frame. 3This type is essentially internal to Wumpus-Basic. Map Extract the internal list of  from a . =The expectation is that this Primitive list will be rendered  by Wumpus-Core as a frame. Form a  from a .   GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered. is a Hughes list of Strings, so it supports  efficient append.  - type synonym for String. :A map between a font name and the respective FontMetrics. 0 store a subset of the properties available in ? a font file - enough to calculate accurate bounding boxes and  positions for text.  3 Bounding box representing the maximum glyph area. # Width vectors for each character.  Cap height  Descender depth. <Because Wumpus always needs font metrics respective to the : current point size, the actual fields are all functions. %A lookup function from code point to  width vector. >The unit is always stored as a Double representing PostScript  points. ?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). 7A family group of FontDefs (regular, bold, italic and  bold-italic). ?It is convenient for some higher-level text objects in Wumpus  (particularly Doc, in Wumpus-Drawing) to treat a font and its 2 standard weights as the same entity. This allows Doc API to  provide a bold, operation to simply change to the the bold > weight of the current family, rather than use the primitive  set_font2 operation to change to an explicitly named font. FontDef wraps FontFace! from Wumpus-Core with file name # information for the font loaders. A Unicode code-point. Extract the regular weight  from a . Extract the bold weight  from a . ANote - this falls back to the regular weight if the font family / has no bold weight. To get the bold weight or Nothing if it ( is not present use the record selector ff_bold.  Extract the italic weight  from a . ANote - this falls back to the regular weight if the font family 3 has no italic weight. To get the italic weight or Nothing if + it is not present use the record selector  ff_italic.  Extract the  bold-italic weight  from a  . ANote - this falls back to the regular weight if the font family > has no bold-italic weight. To get the bold-italic weight or  Nothing/ if it is not present use the record selector  ff_bold_italic. !Print the loader errors from the  to std-out.  : ( name * font_table -> Maybe FontMetrics  !Lookup a font in the font_table.  : / name * font_metrics * font_table -> FontTable  )Insert a named font into the font_table. 8This ignores the Char code lookup and just returns the  default advance vector. )'' GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered5The 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. 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> Safe-Infered;Strictly speaking a fontBBox is measured in integer units.  !"#$%&'( !"#$%&'( !"#$%&'( !"#$%&'( GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered)))) GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered****GHC highly unstablestephen.tetley@gmail.com Safe-Infered++An enumerated type representing quadrants. 0 An enumerated type representing clock directions. 34An enumerated type representing vertical direction. 66An enumerated type representing horizontal direction. 99An enumerated type representing horizontal and vertical  directions. >8An enumeratied type representing the compass positions. G>Wumpus distinguishes two use-cases for displaying vertically  centered text. ?Arbitrary text that is expected to contain lower case letters B with descenders, show take the vertical center as the mid-point 1 between the cap height and the descender depth. :Unfortunately, including the descender depth can produce < unbalanced results for text which is not expected to have A descenders (e.g. numbers within a bordered box), visually this  makes the center too high. J:Vertical alignment - align to the left, center or bottom. N;Horizontal alignment - align to the top, center or bottom. R9Enumerated type for drawing with respect to the z-order. UDraw closed paths and shapes.  " DRAW_STROKE - closed and stroked   DRAW_FILL - closed and filled = DRAW_FILL_STROKE - the path is filled, its edge is stroked. YDraw closed paths.   OSTROKE - open and stroked   CSTROKE - closed and stroke   CFILL - closed and filled A CFILL_STROKE - closed, the path is filled, its edge is stroked. ^9Unit parametric version of KerningChar from Wumpus-Core. eThe empty data type - i.e. () - wrapped with a phantom unit  parameter. r Return a e rather than () at the end of sequence of  monadic commands. 5Many Wumpus objects are usefully constructed in the   do-notation0, but because Wumpus has to expose the type of  the unit2 to the type checker we must finish the do-block  with:   ureturn or:   return UNil  rather than:  return () ss( runs a monadic computation and returns UNil. ta1 an object that gives access to its unit at the  functor position. u`1 an object that gives access to its unit at the  functor position. v1Convert a scalar value from one unit to another. w<Unit convert an object that gives access to its unit at the  Functor position. In practive this will be *all* Image answers. z Interpret a U for a closed path. }<Note - behaviour at the continuity (0 deg, 180 deg, ...) is  unspecified. ~~ :  ang -> Quadrant  Get the quadrant of an angle.  : 5 apex_angle * radius * inclination * center -> [Point]   . ang should be in the range 0 < ang < 360deg. & if 0 < ang <= 90 returns 4 points & if 90 < ang <= 180 returns 7 points ' if 180 < ang <= 270 returns 10 points ' if 270 < ang < 360 returns 13 points  : 8 apex_angle * radius * rotation * center -> BezierCurve  . ang should be in the range 0 < ang <= 90deg.  Applicative both) - run both computations return the pair  of the the answers. 7Monodial scheme - prefix, repeat body n times, suffix. a+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~X+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Xghijklmnopqefrsbcd_`atuvwxy^Y]\[ZUXWVzRTSNQPOJMLKGIH>FEDCBA@?9=<;:021}687{354|+/.-,~5+/.-,0213546879=<;:>FEDCBA@?GIHJMLKNQPORTSUXWVY]\[Z^_`abcdefghijklmnopqrstuvwxyz{|}~GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com>None#Wrapped Double representing an En. $Wrapped Double representing an Em. Wrapped Double Pica unit type. Pica is 12 Points. (Wrapped Double representing Centimeter. 5Cast a value in Centimeters to some Fractional type. ;Note - this casting should only be used for non-contextual  units such as Double. Convert Double to Centimer. .Cast a value in Pica to some Fractional type. ;Note - this casting should only be used for non-contextual  units such as Double. Convert a Double to a Pica. GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered  is equivalent to the to the  MonadReader - class, but the environment type is fixed to . To avoid name clashes with mtl this scheme is used:   askDC = ask  asksDC = asks  localize = local $Note, because the derived operation query (aka asks) is 3 expected to be used more often than queryCtx (aka ask) it  gets the more convenient name. The text margin is measured in  so it is relative to the  current font size. The default value is 0.5. 2Type synonym for DrawingContext update functions.  - the "graphics state" of Wumpus-Basic. B DrawingContext is operated on within a Reader monad rather than  a State monad so "updates" are delineated within a local  operation (called localize# in Wumpus), rather than permanent  until overridden as per set of a State monad. =Note - in contrast to most other drawing objects in Wumpus, ; none of the types of measurement values are parameteric ) (usually notated with the type variable u in Wumpus). Types  are either + representing PostScript points or Em - a ? contextual size that is interpreted according to the current  font size. :It is easier to specialize all the measurement types and  within the  and add parametricity to the  getters and setters instead.  :  font_size -> DrawingContext   Create a . Note -  font_size) is used for sizing more than just text > labels. Arrowheads, plot marks and other elements have their % metrics derived from the font size. (No real font metrics are present in the   created by . Static, hard-coded fallback  metrics derived from the Courier font are available but 7 these metrics might not accurately correspond to the  Courier3 available to the the final renderer (GhostScript,  an SVG viewer, etc.). =Use this constructor for drawings that make primitive use of  text.  font_metrics_table: empty  font_load_log: empty ( fallback_metrics: monospace_metrics  font_face: Courier + font_size: @supplied_font_size@ L stroke_props: line_width 1, no dash_pattern, cap-butt, join-miter.  stroke_colour: black ! fill_colour: light_gray  text_colour: black  line_spacing_factor: 0.2  round_corner_factor: 0 ( text_margin: (0.5 em, 0.5 em)  : , font_size * font_metrics -> DrawingContext   Create a $ with font metrics loaded from the  file system. Note -  font_size) is used for sizing more than just text > labels. Arrowheads, plot marks and other elements have their % metrics derived from the font size. =Use this constructor for drawings that make use of the text  objects provided by Wumpus-Drawing (DocText and RotText).  : ) font_load_result -> DrawinContextUpdate  >Add the font metrics from the FontLoadResult, if a font with $ the same name alreay exists in the  it will be - replaced. Error and warning messages in the font_load_result  will be appended to the  font_load_log.  :  DrawingContextF  $Reset the drawing properties in the  to their 4 default values. This changes the following fields: L stroke_props: line_width 1, no dash_pattern, cap-butt, join-miter.  stroke_colour: black ! fill_colour: light_gray  text_colour: black  line_spacing_factor: 0.2  round_corner_factor: 0 ( text_margin: (0.5 em, 0.5 em)  :  DrawingContextF  !Reset the drawing metrics in the  to their 3 default values. This is a more limited version of  # and changes the following fields: L stroke_props: line_width 1, no dash_pattern, cap-butt, join-miter.  line_spacing_factor: 0.2  round_corner_factor: 0 ( text_margin: (0.5 em, 0.5 em)   GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered;Get the Point corresponding the grid coordinates scaled by  the snap-grid scaling factors. <Scale a vector coordinate by the snap-grid scaling factors. Absolute units. "Get the (x,y) margin around text. >Note - not all text operations in Wumpus are drawn with text  margin. 7Vertical distance between descender of a line and the  cap-height of the line below. =Get the font bounding box - this is the maximum boundary of @ the glyphs in the font. The span of the height is expected to 5 be bigger than the cap_height plus descender depth. Height of a capital letter. -Note - descender is expected to be negative. 6Note - underline_position is expected to be negative. Line width of underline line. 3This is the distance from cap_height to descender.  Variant of ! that accounts for the specified  G. This returns a pair of (yminor, ymajor). )Find the advance vector for the supplied . -Note - the text assumed to be a single line. )Find the advance vector for the supplied .  :  [kerning_char] -> AdvanceVec   hkernvector+ takes whatever length is paired with the A EscapedChar for the init of the the list, for the last element  it takes the charVector. 6Note the CharWidthLookup is not parameteric on units.  CharWidth2 is always Double representing PostScript points. 2 Client code must convert this value accordingly. GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered. : $ x_unit * y_unit -> DrawingContextF  Set the snap grid factors" - a snap grid is an alternative 5 coordinate space, it can be convenient for drawing  " box and arrow" diagrams. set_line_width : $ width_in_points -> DrawingContextF  /Set the line_width to the supplied point size. !Initially the line width is 1.0. Constant+ variations of the function maybe be more  convenient: 7 line_default, line_thin, line_thick, line_ultra_thick Set the line_width to default - 1.0. Set the line_width to thin - 0.5. Set the line_width to thick - 2.0. Set the line_width to  ultra_thick - 4.0. 7Scale the line width respective to its current value. 3The size is calculated with the supplied function. ;Set the line width to a size relative to the current font : size. The size is calculated with the supplied function. )Set the line_cap to the default which is butt. This is a synonym for . Set the line_cap to butt. 6Butt chamfers off the stroke, flush to the end point. This is the default.  .-------.  |=======|  '-------' Set the line_cap to round. 8This rounds the end of the stroke and the visually the 3 rounding slightly extends the length of the line.  .-------.  ( ======= )  '-------' Set the line_cap to square. @This squares off the end of the stroke, but visual extends the  stroke by half the line width.  .---------.  | ======= |  '---------' *Set the line_join to the default which is miter. This is a synonym for . Set the line_join to miter. >This extends the joining line segments to form a sharp miter. This is the default.  /\  /..\  /./\.\  /./ \.\  /./ \.\ Set the line_join to round. 8This rounds off the corner of the joined line segments.  \.\  \.\  ,.)  /./  /./ Set the line_join to round. ?This bevels off the corner of the joined line segments with a  notch.  __  /..\  /./\.\  /./ \.\  /./ \.\ Set the dash pattern. Initially the dash pattern is . Set the dash_pattern to solid - i.e. no dash pattern. This is the default. ,Set the dash pattern to draw a dotted line. ?A dot is actually a square - side length is equal to the line  width. 3The spacing between dots is 2 times the dot width. ;Set the dash pattern to draw a tightly packed dotted line. ?A dot is actually a square - side length is equal to the line  width. 4The spacing between dots is equal to the dot width. 4Set the dash pattern to draw a loosely dotted line. ?A dot is actually a square - side length is equal to the line  width. 3The spacing between dots is 4 times the dot width. ,Set the dash pattern to draw a dashed line. <The dash length is 3 times the line width, the spacing is 2  times the line width. <Set the dash pattern to draw a tightly packed, dashed line. ;The dash length is 3 times the line width, the spacing is  equal to the line width. 4Set the dash pattern to draw a loosely dashed line. <The dash length is 3 times the line width, the spacing is 4  times the line width. 3Set the font attributes, point size and font face. Set the font face. Set the point size. (This controls the drawing size of both 3 text labels and marks (e.g. dots and arrowheads). 4Scale the current point size by the supplied ratio. :Note - as fonts can only be drawn at integral sizes this > operation is not exact - for instance scaling 15pt by (1%2)  results in 7pt. ?Set the point size (font and mark size) to double the current  size. <Set the point size to half the current size, note the point 7 size also controls the size of dots, arrowsheads etc. :Note - as fonts can only be drawn at integral sizes this 9 operation is not exact - half size of 15pt type is 7pt.  : " x_sep * y_sep -> DrawingContextF  Note - this is in Em units. Set the text margin to (0,0). ?This produces a tight box around the text vertically measured A to the cap-height and descender. Therefore some characters may 9 extend outside the margin (e.g. accented capitals like  A-grave). +Set the text margin to (0.25 em, 0.25 em). )Set the text margin to (0.5 em, 0.5 em). )Set the text margin to (1.0 em, 1.0 em). Set the stroke colour. Set the fill colour. Set the text colour. :Set the stroke, fill and text colours to a single colour. )Swap the stroke colour and fill colours. 6Set the fill colour to use the current stroke colour. 6Set the stroke colour to use the current fill colour. 4Set the fill colour to use the current text colour. 6Set the stroke colour to use the current fill colour. 6Set the text colour to use the current stroke colour. 4Set the text colour to use the current fill colour. ....GHC highly unstablestephen.tetley@gmail.com Safe-InferedDecorate an object ?oliterate - drops the graphic from the first object replacing & it with the graphic from the second. Should be read as ! decorate (above|below) A with B  0Note - the kind of f allows fo unit annotation. 1Replace the answer produced by a graphic object. Decorate (ABOVE) a with b. Decorate (BELOW) a with b. Elaborate (ABOVE) a with b. Elaborate (BELOW) a with b.  GHC highly unstablestephen.tetley@gmail.com Safe-InferedConcatenation with movement - the second object is moved  next to the first.  / hconcat is equivalent to @(<>)@ in WL-PPrint.  (infixr 6) 0 vconcat is equivalent to @(<$>)@ in WL_PPrint.  (infixr 5) Minimal defintion is ,  is usually   flip superior.   `superior` (infixr 6)  `anterior` (infixr 6) ,Horizontally concatenate a list of objects.  Note - the first argument is an  alternative - this is drawn 2 if the list is empty, otherwise it is not drawn. *Vertically concatenate a list of objects.  Note - the first argument is an  alternative - this is drawn 2 if the list is empty, otherwise it is not drawn.                     GHC highly unstablestephen.tetley@gmail.com Safe-Infered # 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. # 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.    :  Vec2 -> PointDisplace   Alias for .+^ from Data.AffineSpace. !! :  dist -> ThetaPointDisplace  Build a combinator to move Points in parallel to the ; direction of the implicit angle by the supplied distance  dist. "! :  dist -> ThetaPointDisplace  Build a combinator to move Points perpendicular to the < inclnation of the implicit angle by the supplied distance  dist. ## :  vec -> ThetaPointDisplace  This is a combination of displaceParallel and  displacePerpendicular%, with the x component of the vector 5 displaced in parallel and the y component displaced  perpendicular. $Angular version of  dispDirection. =The displacement direction is with respect to implicit angle  of inclination, so:  up == perpendicular ! down == perdendicular . negate  left == parallel . negate  right == parallel %Angular version of  dispCardinal. =The displacement direction is with respect to implicit angle  of inclination, so:  north == perpendicular  east == parallel ! south == perdendicular . negate  etc. 8Parallel (reverse) 9Parallel (forward) FReturn a-o when supplied length of b-o and the grazing  angle boa:   a  .\  . \  ..b..o /This is useful for building arrowhead vectors. GReturn o-c when supplied length of b-o and the grazing  angle boc:   ..b..o  . /  ./  c /This is useful for building arrowhead vectors. * !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGGHC highly unstablestephen.tetley@gmail.com Safe-InferedIType specialized version of K. JType specialized version of L. O"Strip the graphic content from an L making a H. PTurn a H into an L without graphic content. Q#Constructor for Primtive graphics. RClip an Image. SHaving empty at the specific L type is useful. HIJKLMNOPQRS HIJKLMNOPQRS LKHJIMNOPSQRHIJKLMNOPQRSGHC highly unstablestephen.tetley@gmail.com Safe-InferedUType specialized version of W. VType specialized version of X. X=ConnectorImage - function from DrawingContext and start and  end points to a polymorphic answer and a graphic  primitive. bHaving empty at the specific X type is useful. TUVWXYZ[\]^_`abTUVWXYZ[\]^_`abXWVUTYZ[\]^_`abTUVWXYZ[\]^_`abGHC highly unstablestephen.tetley@gmail.com Safe-InfereddType specialized version of f. eType specialized version of g. g LocThetaImage# - function from start point and ! DrawingContext to a polymorphic answer and a graphic   primitive (PrimW). nFlipped version of m. qHaving empty at the specific g type is useful. s Downcast a g* function by applying it to the supplied  point, making an L.  infixr 1 `at` wThis is analogue to  replicate in the Prelude. 'cdefghijklmnopqrstuvwxy    cdefghijklmnopqrstuvwxygfedchijklmnopqrstuvwxy'cdefghijklmnopqrstuvwxy    GHC highly unstablestephen.tetley@gmail.com Safe-Inferedz3Add operations for branching at the current point. =Not all drawings that support tracing support branching. For > instance Paths can be built by tracing but they always need  a cumulative progression of  next point they cannot resrt to 1 the start point and go in a differnt direction. {Branch is like local in the Reader monad. |)Monad with turtle-like cursor movememnt. ~8Monad with notion of location - i.e. the current point. %Monad that collects a graphic trace,  is analogue  to the Writer monad's tell.  Move the cursor horizontally.  Move the cursor vertically. z{|}~z{|}~~|}z{z{|}~GHC highly unstablestephen.tetley@gmail.com Safe-Infered) is a reader-writer-state monad, unlike   GenLocTrace0 there is no updateable current point, instead = the start point is supplied when the drawing is run and it 5 is translated by the components of the start point. *The writer accumulates a graphical trace.  Essentially,  is an L object extended  with user state. 0Forget the user state LocImage, just return the answer.  Forget the answer, just return the user state. Simple version of  - run a  without  user state.   GHC highly unstablestephen.tetley@gmail.com Safe-Infered,GenLocTrace is a reader-writer-state monad. ;The writer accumulates a graphical trace and the state is  the current point. 0Forget the user state LocImage, just return the answer.  Forget the answer, just return the user state. Simple version of  - run a  without  user state. GHC unstablestephen.tetley@gmail.com Safe-Infered<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. 0Primitive operation - cf. tell in Reader monad. 2Draw a Graphic taking the drawing style from the  drawing context. This function is the  forgetful version of .  Commonly, it is used to draw K objects which  have no answer. 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. ;Draw a LocImage at the supplied Anchor taking the drawing  style from the drawing context. This function is the  forgetful version of .  Commonly, it is used to draw f objects which  have no answer. :Draw a LocImage at the supplied Point 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. >Draw a ConnectorGraphic with the supplied Anchors taking the  drawing style from the drawing context. This function is the  forgetful version of .  Commonly, it is used to draw W objects which  have no answer. ;Draw a ConnectorImage with the supplied Points 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. 8Draw the object with the supplied grid coordinate. The - actual position is scaled according to the  snap_grid_factors in the drawing context. This function is the  forgetful version of .  Commonly, it is used to draw f objects which  have no answer. 8Draw the object with the supplied grid coordinate. The - actual position is scaled according to the  snap_grid_factors in the drawing context. <Draw a connector between two objects. The projection of the ? connector line is drawn on the line from center to center of @ the objects, the actual start and end points of the drawn line > are the radial points on the objects borders that cross the  projected line. This function is the  forgetful version of .  Commonly, it is used to draw f objects which  have no answer. <Draw a connector between two objects. The projection of the ? connector line is drawn on the line from center to center of @ the objects, the actual start and end points of the drawn line > are the radial points on the objects borders that cross the  projected line.  !" !"GHC unstablestephen.tetley@gmail.com Safe-Infered A  Contextual Picture.  . CtxPicture = DrawingContext -> Maybe Picture This type corresponds to the # type in Wumpus-Core, but  it is embedded with a  (for font properties, @ fill colour etc.). The DrawingContext is embedded so that font  metrics - loaded in IO& can be passed into the pure world of  .  Internally a context picture is a function from   to (Maybe Picture). The Maybe represents > that it is possible to construct empty Pictures, even though   Wumpus-Core0 cannot render them. Just as the DrawingContext > pushes font-metrics from the IO to the pure world, the Maybe ? lifts the problem of unrenderable Pictures into the API where , client code must deal with it explicitly. ?(In practice, it is very unlikely a program will create empty  pictures and runCtxPictureU can be used without worry). &Note - pictures are fixed to the unit Double (representing A PostScript points). Pictures are intentionally unsophisticated, ? any fine grained control of units should be delegated to the A elements that build the picture (Graphics, LocGraphics, etc.).  : , drawing_ctx * ctx_picture -> Maybe Picture  Run a  with the supplied   producing a #. 8The resulting Picture may be empty. Wumpus-Core cannot ? generate empty pictures as they have no bounding box, so the A result is wrapped within a Maybe. This delegates reponsibility - for handling empty pictures to client code.  : & drawing_ctx * ctx_picture -> Picture  Unsafe version of . ;This function throws a runtime error when supplied with an  empty CtxPicture.  :  trace_drawing -> CtxPicture   Transform a  into a .  : 2 scalar_unit_value * trace_drawing -> CtxPicture   Variant of & with a phantom first argument - the ) phantom identifies the unit type of the  . It is % not scurtinized at the value level.  : # trafo * ctx_picture -> CtxPicture  /Apply a picture transformation function to the #  warpped in a . Draw a, move b) so its center is at the same center as  a, b) is drawn over underneath in the zorder.  a `cxpUniteCenter` b *Center the picture at the supplied point. $"Avoid initial mempty for mconcat. %&'()$*+,-%&'()$*+,-GHC highly unstablestephen.tetley@gmail.com Safe-InferedAdvance vector& graphic - this partially models the  PostScript show command which moves the  current point by the 4 advance (width) vector as each character is drawn. 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. 7Extract 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. 6Extract the verticall component of an advance vector. *Running an AdvObject produces a LocImage.  : + loc_context_function * image -> AdvObject   Build an  from a context function (CF) that 0 generates the answer displacement vector and a f  that draws the . emptyAdvObjectAU :  AdvObject  Build an empty . The  is treated as a null primitive by   Wumpus-Core2 and is not drawn, the answer vector generated is  the zero vector (V2 0 0). 8Draw the first AdvObject and use the advance vector to  displace the second AdvObject. 5The final answer is the sum of both advance vectors. (Concatenate the list of AdvObjects with . 7Combine the AdvObjects using the answer vector of the A first object plus the separator to move the start of the second  object. List version of  nextSpace. Repeat the AdvObject n times, moving each time with  . :Concatenate the list of AdvObjects, going next and adding  the separator at each step. ;Render the supplied AdvObject, but swap the result advance @ for the supplied vector. This function has behaviour analogue  to fill in the  wl-pprint library. ./0123./0123GHC highly unstablestephen.tetley@gmail.com Safe-InferedType specialized version of . Type specialized version of . . - function from start point, inclination and ! DrawingContext to a polymorphic answer and a graphic   primitive (PrimW). Having empty at the specific  type is useful.  Downcast a ! function by applying it to the  supplied angle, making a g. Flipped version of  456789:;<=>?456789:;<=>? GHC highly unstablestephen.tetley@gmail.com Safe-Infered :  [next_vector] -> LocImage PrimPath  Create a path query - i.e. a functional type  from Point to PrimPath. This is the analogue to  vectorPath in  Wumpus-Core , but the  result is produced within the DrawingContext.  :  (Point ~> PrimPath)  Create an empty path query - i.e. a functional type  from Point to PrimPath. This is the analogue to  emptyPath in  Wumpus-Core , but the  result is produced within the DrawingContext.  :  (Point ~> PrimPath)  >Create a PrimPath made of straight line segments joining the  supplied points. This is the analogue to @ in  Wumpus-Core, but  it is polymorphic on unit.  :  (Point ~> PrimPath)  2Create a path made of curve segments joining the  supplied points. This is the analogue to A in  Wumpus-Core, but  it is polymorphic on unit.  :  path -> Graphic  This is the analogue to the B function in   Wumpus-Core3, but the drawing properties (colour, line width, # etc.) are taken from the implicit DrawingContext.  :  DrawStyle * path -> Graphic  7Draw a closed path according to the supplied DrawStyle " ( fill | stroke | fill_stroke).  :  string -> LocGraphic  Create a text f - i.e. a functional type  from Point to Graphic. ;The implicit point of the LocGraphic is the baseline left. This is the analogue to C in  Wumpus-core , but the A text properties (font family, font size, colour) are taken from  the implicit DrawingContext.  :  string -> LocThetaGraphic  Create a text  - i.e. a functional type  from Point and Angle to Graphic. ?The implicit point of the LocGraphic is the baseline left, the 0 implicit angle is rotation factor of the text. @Note - rotated text often does not render well in PostScript or - SVG. Rotated text should be used sparingly. This is the analogue to D in  Wumpus-core.  :  escaped_text -> LocGraphic  Create a text f - i.e. a functional type  from Point to Graphic. ;The implicit point of the LocGraphic is the baseline left. This is the analogue to E in  Wumpus-core, but A the text properties (font family, font size, colour) are taken  from the implicit DrawingContext.  : ! escaped_text -> LocThetaGraphic  Create a text  - i.e. a functional type  from Point and Angle to Graphic. ?The implicit point of the LocGraphic is the baseline left, the 0 implicit angle is rotation factor of the text. @Note - rotated text often does not render well in PostScript or - SVG. Rotated text should be used sparingly. This is the analogue to F in  Wumpus-core, but A the text properties (font family, font size, colour) are taken  from the implicit DrawingContext.  :  [kern_char] -> LocGraphic  "Create a horizontally kerned text f - i.e. a  functional type from Point to Graphic. ;The implicit point of the LocGraphic is the baseline left. This is the analogue to G in  Wumpus-core, but A the text properties (font family, font size, colour) are taken  from the implicit DrawingContext.  :  [kern_char] -> LocGraphic   Create a vertically kerned text f - i.e. a  functional type from Point to Graphic. ;The implicit point of the LocGraphic is the baseline left. This is the analogue to H in  Wumpus-core, but A the text properties (font family, font size, colour) are taken  from the implicit DrawingContext.  : ' start_point * end_point -> LocGraphic  Create a straight line K, the start and end point  are supplied explicitly. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext.  :  vec_to -> LocGraphic  Create a stright line f - i.e. a functional type  from Point to Graphic. >The implicit point of the LocGraphic is the start point, the A end point is calculated by displacing the start point with the  supplied vector. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext.  curveLine : ! start_point * control_point1 * . control_point2 * end_point -> Graphic  Create a Bezier curve K, all control points are  supplied explicitly. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext.  : & start_point * end_point -> Connector  Create a straight line K, the start and end point  are supplied implicitly. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext.  : " DrawStyle * radius -> LocGraphic  Create a circle f - the implicit point is 7 center. The circle is drawn with four Bezier curves. /The respective line or fill properties for the  DrawStyle are  taken from the implicit DrawingContext. strokedEllipse : # x_radius * y_radius -> LocGraphic  Create a stroked ellipse f - the implicit point is 8 center. The ellipse is drawn with four Bezier curves. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext.  : # x_radius * y_radius -> LocGraphic  Create a bordered ellipse  - the implicit point < is center and the angle is rotation about the center. The - ellipse is drawn with four Bezier curves. >The background fill colour and the outline stroke properties  are taken from the implicit DrawingContext. strokedRectangle : & style * width * height -> LocGraphic  Create a stroked rectangle f - the implicit point is  bottom-left. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext.  :  radius -> LocGraphic  Create a circle f - the implicit point is the  center. 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 pen width is scaled as well as  the shape. 8For stroked circles that can be adequately scaled, use   instead. ?The fill or stroke properties for the respective DrawStyle are  taken from the implicit DrawingContext. strokeEllipseDisk : # x_radius * y_radius -> LocGraphic  Create a stroked ellipse f - the implicit point is  the center. 5This is a efficient representation of circles using  PostScript's arc or SVG's ellipse in the generated ; output. However, stroked ellipses do not draw well after ; non-uniform scaling - the pen width is scaled as well as  the shape. 9For stroked ellipses that can be adequately scaled, use  strokedEllipse instead. =The line properties (colour, pen thickness, etc.) are taken  from the implicit DrawingContext. dcArc : radius * apex_angle Always open-stroked. !GHC highly unstablestephen.tetley@gmail.com Safe-Infered?Version of PosGraphic specialized to Double for the unit type. 6Version of PosObject with answer specialized to UNil. >Version of PosObject specialized to Double for the unit type. Type synonym for GenPosObject () u a, a PosObject without  user state. A positionable "Object". *Running an PosObject produces a LocImage. 6Run a PosObject producing a LocImage (BoundingBox u).  : % object_pos * loc_image -> PosObject   Create a  from an l describing how it / is orientated within a border rectangle and a g that  draws it.  This is the primary) constructor for PosObjects. Because the > PosObject type is considered as a specialized object it does ? not have the range of functions of LocImage or LocThetaImage.  :  PosObject  Build an empty PosGraphicObject.  Extend the orientation.  =Note - this is a bad API, it would be better to have padders 6 and fillers and not expose the orientation directly.   Illustrate a  by super-imposing its l. This turns the  into a g drawn at the locus  of the PosObject. 9Note - no margins are added to the containing rectangle.  To get a Char with margins, use  instead:  posText ['1'] ,Primtive builder that does not add margins. ,Primtive builder that does not add margins. Note - for single line text. Note - for single line text. 1The query should retrieve the width of one char.  1The query should retrieve the width of one char. 0      IJKLMNOPQRS%      %      0      IJKLMNOPQRS"GHC highly unstablestephen.tetley@gmail.com Safe-Infered$$ :  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. %Build an empty f returning a bounding box. The % is treated as a null primitive  by  Wumpus-Core- and is not drawn, although it does generate 9 the minimum bounding box with both the bottom-left and 2 upper-right corners at the implicit start point. &Build an empty  returning a bounding box. The & is treated as a  null primitive by  Wumpus-Core and is not drawn, although : it does generate the minimum bounding box with both the B bottom-left and upper-right corners at the implicit start point '6Draw a BoundedGraphic, illustrating the bounding box. (9Draw a BoundedLocGraphic, illustrating the bounding box. )>Draw a BoundedLocThetaGraphic, illustrating the bounding box. *1Draw a bounding box as a stroked rectangle with  dotted lines. ++ : & style * width * height -> LocGraphic  :Create a stroked rectangle - the implicit start point is   bottom-left3, return the bounding box of the rectangle as the  answer. =The line properties (colour, pen thickness, etc.) are taken  from the implicit . !"#$%&'()*+ !"#$%&'()*+ #"!$%&'()*+ !"#$%&'()*+#GHC highly unstablestephen.tetley@gmail.com Safe-Infered,Trail segment - trails are  prototype paths, so the are 8 built from the usual straight lines and Bezier curves. / Trail supporting concatenation. 0=Trail with an initial (undrawn) displacement - an anacrusis. 2This allows trails to represent centered objects. 1 Render a / to make a drawable f. 2 Render an 0 to make a drawable f. 3 Destructor for the opaque 0 type. 4 Destructor for the opaque / type. 5Turn a / into a 0. 7=Create a AnaTrail from the vector list - each vector in the 9 input list iterates to the start point rather then the  cumulative tip. 4When the AnaTrail is run, the supplied point is the locus of 8 the path and it does not form part of the path proper. Like trailStartIsLocus), this constructor is typically used to  make  shape paths(. Some shapes are easier to express as 3 iterated displacements of the center rather than  turtle drawing. :Alternative to catline$, specifying the vector components  rather the vector itself.  (cf. orthoVec from Wumpus-Core) <>Form a Bezier CatTrail from the vectors between four control  points. ==Form a CatTrail from the linear segment joining the list of  points. =Some configurations of vectors seem easier to specify using < located points then making them coordinate free by taking  the joining vectors. >> :  width * height -> AnaTrail  ?? : & half_width * half_height -> AnaTrail  @@ : ! num_points * radius -> AnaTrail  A!wedgeTrail : radius * apex_angle Wedge is drawn at the apex. dReturn the line a-o when supplied length of b-o and the  grazing angle boa:   a  .\  . \  ..b..o /This is useful for building arrowhead vectors. eReturn the line o-c when supplied length of b-o and the  grazing angle boc:   ..b..o  . /  ./  c /This is useful for building arrowhead vectors. g+One-phase sine wave. Height is parametric. hT :  base_vector -> CatTrail  1Make an open semicircle from two Bezier curves. 7Although this function produces an approximation of a 7 semicircle, the approximation seems fine in practice. ih : 0 clock_direction * ry * base_vector -> CatTrail  2Make an open semiellipse from two Bezier curves. 7Although this function produces an approximation of a 8 semiellipse, the approximation seems fine in practice. jj : # clock_direction * angle * radius  * inclination -> CatTrail  . ang should be in the range 0 < ang <= 90deg. kk : ( clock_direction * apex_angle * radius  * inclination -> CatTrail   . ang should be in the range 0 < ang < 360deg. ' if 0 < ang <= 90 returns 1 segment ( if 90 < ang <= 180 returns 2 segments ( if 180 < ang <= 270 returns 3 segments ) if 270 < ang < 360 returns 4 segmenets m<Proper semicircles do not make a good squiggle (it needs a  bit of pinch). qq : * clock_direction * base_width * height * # base_inclination -> CatTrail  =Curve in a triangle - base_width and height are expected to  be positive. rr : * clock_direction * base_width * height * # base_inclination -> CatTrail  Curve in a rectangle. sCurve in a trapezium. tCurve in half a bowtie. u5Wedge curve formed inside a bowtie rotated by 90deg. v,Variation of wedge curve that draws a loop. M,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvUVK,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvK,.-/0213456789;:<=>?@ABCDEFGHIJKLMNOPQSRTUVWXYZ[\]^_`abcdehijklfgnompqrstuvK,.-/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvUV$GHC highly unstablestephen.tetley@gmail.com Safe-Inferedw5scheme_start is a function from the origin to state. =For instance, we might want to cache the origin - this would * not be possible if start was just a pure cst value. 0Forget the user state LocImage, just return the answer.  Forget the answer, just return the user state. 2Demand a point on the Chain and draw the LocImage  at it. ,Demand the next position, but draw nothing. :Chain a list of images, each demanding a succesive start  point. Replicate a LocImage n times along a Chain. !Return the count of chain steps. :General scheme - iterate the next point with the supplied  function. >General scheme - displace successively by the elements of the  list of vectors. 6Note - the list is cycled to make the chain infinite. &Derive a ChainScheme from a CatTrail. ?Note - this iterates the control points of curves, it does not  iterate points on the curve. >Build an (infinite) ChainScheme for a prefix list of counted 7 schemes and a final scheme that runs out to infinity. <Generate a tabular scheme going rowwise (left-to-right) and  downwards. <TODO - should probably account for the initial position... ;Generate a tabular scheme going columwise (top-to-bottom)  and rightwards. <TODO - should probably account for the initial position... =TODO - account for CW CCW or just rely on +ve -ve angles?... &wxyz{|}~WXYZ[\]wxyz{|}~}|{wxyz~#wxyz{|}~WXYZ[\])GHC highly unstablestephen.tetley@gmail.com Safe-Inferedlmnopqrstuvwxyz{|}~+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~%GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered Promote an IO action into the the  FontLoadIO monad. This function is equivalent to 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. 8Afm 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. ^_   ^_&GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered :   path_to_afm_fonts * [font_name] -> IO FontLoadResult  "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.  :  3 path_to_afm_fonts * font_def -> IO FontLoadResult  Load a single AFM font. >Note - if the font fails to load a message is written to the  log and monospaced fallback metrics are used. 'GHChighly unstable)Stephen Tetley <stephen.tetley@gmail.com> Safe-Infered :   path_to_gs_fonts * [font_name] -> IO FontLoadResult  "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.  :  3 path_to_gs_fonts * font_name -> IO FontLoadResult  !Load a single GhostScript font. >Note - if the font fails to load a message is written to the  log and monospaced fallback metrics are used. (GHC highly unstablestephen.tetley@gmail.com Safe-Infered4A FontLoader is an action from a list of fonts to a   returned in IO.  Fonts are supplied in a list of Either FontDef FontFamily, > this is a little cumbersome but it allows the loader to load  individual fonts and /' or a whole families with a single API  call. /Tries to find the GhostScript metrics first... 2Runs the IO action on the loader if it finds one. ,Either of one of the environment variables  WUMPUS_AFM_FONT_DIR or WUMPUS_GS_FONT_DIR must be defined + and point to their respective directory. `*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                 ! " " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh1ijklmnopqrstuvwxyz{|}~                        !!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!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[\]^_`abcbdbebfbgbhbibjbk!l!m!n!o!p!q!r!s!t!u!v#w#x#y$z${$|$}$~$$%%wumpus-basic-0.24.0Wumpus.Basic.VersionNumberWumpus.Basic.Utils.JoinList$Wumpus.Basic.Utils.ParserCombinatorsWumpus.Basic.Utils.TokenParsersWumpus.Basic.Utils.HList'Wumpus.Basic.Kernel.Objects.Orientation#Wumpus.Basic.Kernel.Objects.Anchors)Wumpus.Basic.Kernel.Base.WrappedPrimitive$Wumpus.Basic.Kernel.Base.FontSupport(Wumpus.Basic.System.FontLoader.Datatypes,Wumpus.Basic.System.FontLoader.AfmParserBase.Wumpus.Basic.System.FontLoader.AfmV4Dot1Parser*Wumpus.Basic.System.FontLoader.AfmV2Parser!Wumpus.Basic.Kernel.Base.BaseDefsWumpus.Basic.Kernel.Base.Units'Wumpus.Basic.Kernel.Base.DrawingContext Wumpus.Basic.Kernel.Base.QueryDC!Wumpus.Basic.Kernel.Base.UpdateDC!Wumpus.Basic.Kernel.Objects.Basis"Wumpus.Basic.Kernel.Objects.Concat(Wumpus.Basic.Kernel.Objects.Displacement!Wumpus.Basic.Kernel.Objects.Image%Wumpus.Basic.Kernel.Objects.Connector$Wumpus.Basic.Kernel.Objects.LocImage!Wumpus.Basic.Kernel.Drawing.Basis&Wumpus.Basic.Kernel.Drawing.LocDrawing$Wumpus.Basic.Kernel.Drawing.LocTrace(Wumpus.Basic.Kernel.Drawing.TraceDrawing&Wumpus.Basic.Kernel.Drawing.CtxPicture%Wumpus.Basic.Kernel.Objects.AdvObject)Wumpus.Basic.Kernel.Objects.LocThetaImage-Wumpus.Basic.Kernel.Objects.DrawingPrimitives%Wumpus.Basic.Kernel.Drawing.PosObject#Wumpus.Basic.Kernel.Objects.Bounded!Wumpus.Basic.Kernel.Objects.Trail!Wumpus.Basic.Kernel.Drawing.Chain,Wumpus.Basic.System.FontLoader.FontLoadMonad*Wumpus.Basic.System.FontLoader.AfmTopLevel)Wumpus.Basic.System.FontLoader.GSTopLevelWumpus.Basic.System.FontLoaderWumpus.Basic.Kernelwumpus_basic_versionViewR:>EmptyRViewL:<EmptyLJoinListtoListfromList fromListFtoListFtoListMzipWithIntoListnullemptyoneconssnocjoinheadtakeLlength takeWhileL accumMapLviewlviewrunViewLunViewR ParseError CharResult CharParserParserResultOkayFail runParserrunParserEitherapplyfailure throwError lookaheadpeekeofequalssatisfyoneOfnoneOfchainl1chainr1chainlchainrchoicecountbetweenoption optionMaybe optionUnitskipOneskipMany skipMany1many1sepBysepBy1sepEndBy sepEndBy1manyTill manyTill1charstringanyCharupperlowerletteralphaNumdigithexDigitoctDigitnewlinetabspace LexemeParserspaceLexemeParserspaceCharLexemeParsercommentLexemeParsercommentLineLexemeParsercommentMultiLexemeParserlexeme whiteSpaceoctBaseoctHaskhexBasenaturalintegerdoubleHemptyHwrapHconsHsnocHappendHunfoldrHveloHconcatHtoListH prefixListH fromListH Orientation or_x_minor or_x_major or_y_minor or_y_major RectAddressBLRBLCBLLSWSENWNEWWEESSNNORIGINCENTERvtoRectAddress vtoOriginorientationBoundsorientationWidthorientationHeightrotateOrientationextendOrientation extendOLeft extendORight extendODown extendOUp fillHEven fillXMinor fillXMajor fillVEven fillYMinor fillYMajor spineRight spineBelow halignBottomO halignCenterO halignTopO valignLeftO valignCenterO valignRightO spinemoveH spinemoveVbinmoveHBottombinmoveHCenter binmoveHTop binmoveVLeftbinmoveVCenter binmoveVRightSideMidpointAnchor sideMidpointBottomCornerAnchorbottomLeftCornerbottomRightCornerTopCornerAnchor topLeftCornertopRightCorner RadialAnchor radialAnchorCardinalAnchor2 northeast southeast southwest northwestCardinalAnchornorthsoutheastwest ApexAnchorapex CenterAnchorcenterAnchor projectAnchorradialConnectorPointsHPrimCatPrimprim1cpmapcpmove hprimToListsingleHFontLoadResultloaded_font_table loader_errors FontLoadLog FontLoadMsg FontTable FontMetricsget_bounding_box get_cw_tableget_cap_height get_descenderget_underline_positionget_underline_thicknessCharWidthLookup FontFamily ff_regularff_bold ff_italicff_bold_italicFontDef font_def_face gs_file_name afm_file_name CodePointFontName regularWeight boldWeight italicWeightboldItalicWeightemptyFontTable fontLoadMsgprintLoadErrors lookupFont insertFontmonospace_metrics FontPropsfp_bounding_boxfp_default_adv_vec fp_adv_vecs fp_cap_height fp_descenderfp_underline_positionfp_underline_thicknessMonospaceDefaultsdefault_letter_bboxdefault_cap_heightdefault_descenderdefault_underline_positiondefault_underline_thicknessdefault_char_widthAfmGlyphMetrics afm_char_codeafm_width_vector afm_char_nameAfmFile afm_encodingafm_letter_bboxafm_cap_height afm_descenderafm_underline_positionafm_underline_thicknessafm_glyph_metrics GlobalInfoAfmKeyAfmBoundingBoxPSEncodingScheme PSCharCodebuildMetricsOps afmFileParserrunQuery textQuery getFontBBoxgetEncodingScheme getCapHeightcharBBoxmetric keyStringPair versionNumberstartCharMetricskeyName newlineOrEOF uptoNewlinenamename1seminumbercinthexIntoctIntsymbolintafmV4Dot1Parser afmV2ParserQuadrantQUAD_SEQUAD_SWQUAD_NWQUAD_NEClockDirectionCCWCW VDirection DOWNWARDSUPWARDS HDirection RIGHTWARDS LEFTWARDS DirectionRIGHTLEFTDOWNUPCardinal NORTH_WESTWEST SOUTH_WESTSOUTH SOUTH_EASTEAST NORTH_EASTNORTH TextHeightCAP_HEIGHT_PLUS_DESCENDERJUST_CAP_HEIGHTVAlign VALIGN_RIGHT VALIGN_CENTER VALIGN_LEFTHAlign HALIGN_BASE HALIGN_CENTER HALIGN_TOPZOrderZABOVEZBELOWDrawModeDRAW_FILL_STROKE DRAW_FILL DRAW_STROKEPathMode CFILL_STROKECFILLCSTROKEOSTROKEKernChar InterpretUnit normalizedinterp ScalarUnit fromPsPoint toPsPointUNil quarter_pihalf_pitwo_piang180ang150ang120ang90ang60ang45ang30ang15ureturnuvoiddinterpF normalizeF uconvert1 uconvertF intraMapPointintraMapFunctor closedModehorizontalDirectionverticalDirectionclockDirectionquadrantbezierArcPointsbezierMinorArcbothmonPreRepeatPostEnEmPica Centimetercmdcmpicadpica DrawingCtxMaskDCasksDClocalize TextMargin text_margin_x text_margin_yDrawingContextFDrawingContextdc_font_metrics_tabledc_font_load_logdc_fallback_metrics dc_font_face dc_font_sizedc_snap_grid_factorsdc_stroke_propsdc_stroke_colourdc_fill_colourdc_text_colourdc_line_spacing_factordc_text_marginstandardContextmetricsContext addFontTablesreset_drawing_propertiesreset_drawing_metricswithFontMetrics normalizeCtx normalizeCtxF dinterpCtx dinterpCtxF uconvertCtx1 uconvertCtxF pointSize strokeAttrfillAttr borderedAttrtextAttrpositionsnapmove textMargin getLineWidth getFontAttr getFontSize getFontFace getTextColour textlineSpaceglyphBoundingBox capHeight descenderunderlinePositionunderlineThickness verticalSpan heightSpan escTextVector escCharVector hkernVector cwLookupTablesnap_grid_factorsset_line_width line_default line_thin line_thickline_ultra_thickrelative_line_widthcontextual_line_width cap_defaultcap_butt cap_round cap_square join_default join_miter join_round join_bevelset_dash_pattern solid_line dotted_line packed_dotted loose_dotted dashed_line packed_dashed loose_dashed font_attrset_font set_font_sizescale_point_sizedouble_point_sizehalf_point_size text_margintext_margin_nonetext_margin_tighttext_margin_defaulttext_margin_loose stroke_colour fill_colour text_colour single_colour swap_coloursfill_use_stroke_colourstroke_use_fill_colourfill_use_text_colourstroke_use_text_colourtext_use_stroke_colourtext_use_fill_colourDecoratedecorate elaborate obliterate hyperlinksvgId svgAnnotateUConvertuconvFuconvZ PrimResult ignoreAns replaceAns decorateAbove decorateBelowelaborateAboveelaborateBelow AlignSpace halignSpace valignSpaceAlignhalignvalignCatSpacehspacevspaceConcathconcatvconcatZConcatanteriorsuperiorcathcatvcathsepvsepalignRow alignColumn alignRowSepalignColumnSepThetaPointDisplace PointDisplacedisplace dispParalleldispPerpendicular dispOrthodispDirectionThetadispCardinalThetago_upgo_downgo_leftgo_rightgo_northgo_southgo_eastgo_west go_north_east go_north_west go_south_east go_south_west go_up_left go_up_right go_down_left go_down_righttheta_up theta_down theta_left theta_right theta_north theta_south theta_east theta_westtheta_north_easttheta_north_westtheta_south_easttheta_south_west theta_up_lefttheta_up_righttheta_down_lefttheta_down_righttheta_adj_grazingtheta_bkwd_adj_grazingQueryDGraphicDImageGraphicImagerunImage stripImage liftQuery primGraphic clipImage emptyImageConnectorQueryDConnectorGraphicDConnectorImageConnectorGraphicConnectorImagerunConnectorImagerunConnectorQueryconnectstripConnectorImageliftConnectorQuery promoteConn applyConn qpromoteConn qapplyConnemptyConnectorImageLocQuery DLocGraphic DLocImage LocGraphicLocImage runLocImage runLocQuery stripLocImage liftLocQuery promoteLocapplyLoc supplyLoc qpromoteLoc qapplyLoc emptyLocImage moveStartatdistribdistribHdistribV duplicate duplicateH duplicateV BranchCursorM branchCursorCursorMmoveby LocationMlocationInsertlMinsertlinsertl_ UserStateMgetStatesetState updateStateUStatehmovebyvmovebyLocDrawMinsertiinserti_insertli insertli_insertci insertci_ LocDrawing GenLocDrawingrunGenLocDrawingevalGenLocDrawingexecGenLocDrawingstripGenLocDrawing runLocDrawingrunLocDrawing_LocTrace GenLocTracerunGenLocTraceevalGenLocTraceexecGenLocTracestripGenLocTrace runLocTrace runLocTrace_ DTraceDrawing TraceDrawingGenTraceDrawingrunTraceDrawingexecTraceDrawingevalTraceDrawingrunGenTraceDrawingliftToPictureUliftToPictureMb mbPictureUtrace fontDelta evalQuerydrawdrawidrawldrawlidrawcdrawcinodenodeidrawrcdrawrci CtxPicture runCtxPicturerunCtxPictureU drawTracing udrawTracing mapCtxPicture uniteCenter centeredAt DAdvGraphic AdvGraphic DAdvObject AdvObject AdvanceVecadvanceHadvanceV runAdvObject makeAdvObjectemptyAdvObjectblankAdvObjectadvanceadvancesadvspace evenspace advrepeat punctuateadvfill LocThetaQueryDLocThetaGraphicDLocThetaImageLocThetaGraphic LocThetaImagerunLocThetaImagerunLocThetaQuerystripLocThetaImageliftLocThetaQuerypromoteLocTheta applyLocThetasupplyLocThetaqpromoteLocThetaqapplyLocThetaemptyLocThetaImageincline atIncline supplyInclinelocPP emptyLocPPvertexPPcurvePPdcPath dcOpenPath dcClosedPath dcTextlabel dcRTextlabeldcEscapedlabeldcREscapedlabel hkernLine vkernLine straightLinelocStraightLine curvedLinestraightConnectordcCircle dcEllipse dcREllipse dcRectangledcDisk dcEllipseDiskdcArc DPosGraphic PosGraphic DPosObject PosObject GenPosGraphic GenPosObjectrunGenPosObjectevalGenPosObjectexecGenPosObject runPosObjectrunPosObjectBBox makePosObjectemptyPosObjectelaboratePosObjectdecoratePosObjectextendPosObjectmapOrientationillustratePosObjectposChar posEscCharposCharUprightposEscCharUpright posCharPrimposText posEscTextposTextUprightposEscTextUpright posTextPrimmultilinePosTextmultilinePosEscTextrposText rposEscTextrposChar rposEscChar posHKernText monospaceTextmonospaceEscTextBoundedLocThetaGraphicBoundedLocGraphicBoundedGraphiccenterOrthoBBoxemptyBoundedLocGraphicemptyBoundedLocThetaGraphicillustrateBoundedGraphicillustrateBoundedLocGraphic illustrateBoundedLocThetaGraphic bbrectangle boundedRect TrailSegmentTCurveTLineCatTrailAnaTrailrenderCatTrailrenderAnaTrail destrAnaTrail destrCatTrail anaCatTrail modifyAnatrailIterateLocusanaTrailPointscatline orthoCatTrailcatcurve diffCurve diffLinesrectangleTrail diamondTrail polygonTrail wedgeTrailtrail_up trail_down trail_left trail_right trail_north trail_south trail_east trail_westtrail_north_easttrail_north_westtrail_south_easttrail_south_west trail_up_lefttrail_up_righttrail_down_lefttrail_down_right trail_perp trail_paratrail_theta_uptrail_theta_downtrail_theta_lefttrail_theta_righttrail_theta_northtrail_theta_southtrail_theta_easttrail_theta_westtrail_theta_north_easttrail_theta_north_westtrail_theta_south_easttrail_theta_south_westtrail_theta_up_lefttrail_theta_up_righttrail_theta_down_lefttrail_theta_down_righttrail_theta_adj_grazingtrail_theta_bkwd_adj_grazingsineWave sineWave1semicircleTrailsemiellipseTrailminorCircleSweep circleSweep circularArc squiggleWave squareWave sawtoothWavesemicircleWavetriCurve rectCurve trapCurvebowCurve wedgeCurve loopCurve ChainScheme chain_init chain_stepDChainChainGenChain runGenChain evalGenChain execGenChain stripGenChainrunChain runChain_chain1 chainSkip_ chainManychainReplicate chainCountiterationSchemesequenceSchemecatTrailSchemecountingSchemehorizontalSchemeverticalSchemerowwiseTableSchemecolumnwiseTableSchemedistribRowwiseTableduplicateRowwiseTabledistribColumnwiseTableduplicateColumnwiseTableradialChainScheme FontLoadIO runFontLoadIOevalFontLoadIO loadError tellLoadMsg promoteIO promoteEither runParserFLIO sequenceAllbuildAfmFontProps checkFontPathloadAfmFontMetrics loadAfmFont1loadGSFontMetrics loadGSFont1 FontLoaderafmLoaderByEnv gsLoaderByEnvsimpleFontLoaderdefault_font_loader_help$fFunctorViewR$fFunctorViewL$fTraversableJoinList$fFoldableJoinList$fFunctorJoinList$fMonoidJoinList$fShowJoinListbaseControl.Applicativesome$fMonadPlusParser $fMonadParser$fAlternativeParser$fApplicativeParser$fFunctorParser$fMonoidOrientation$fFunctorOrientation$fCardinalAnchor2BoundingBox$fCardinalAnchorBoundingBox$fCenterAnchorBoundingBoxwumpus-core-0.52.1Wumpus.Core.PictureInternal Primitive $fMonoidHPrim$fTranslateCatPrim$fScaleCatPrim$fRotateAboutCatPrim$fRotateCatPrim$fMonoidCatPrim$fMonoidFontLoadLog$fMonoidFontTableWumpus.Core.FontSizeAfmUnit$fInterpretUnitAfmUnit$fInterpretUnitDouble$fScalarUnitDouble$fTranslateUNil $fScaleUNil$fRotateAboutUNil $fRotateUNil $fMonoidUNil $fFunctorUNil $fToleranceEn$fInterpretUnitEn$fShowEn $fToleranceEm$fInterpretUnitEm$fShowEm$fTolerancePica$fInterpretUnitPica$fScalarUnitPica $fShowPica$fToleranceCentimeter$fInterpretUnitCentimeter$fScalarUnitCentimeter$fShowCentimeterghc-prim GHC.TypesDoubleWumpus.Core.Text.Base EscapedText EscapedCharWumpus.Core.GraphicPropsSolid$fTranslateImage $fScaleImage$fRotateAboutImage $fRotateImage$fDecorateImage$fUConvertImage$fDrawingCtxMQuery$fDrawingCtxMImage $fMonoidQuery $fMonoidImage $fMonadQuery $fMonadImage$fApplicativeQuery$fApplicativeImage$fFunctorQuery$fFunctorImage$fUConvertConnectorImage$fDecorateConnectorImage$fDrawingCtxMConnectorQuery$fDrawingCtxMConnectorImage$fMonoidConnectorQuery$fMonoidConnectorImage$fMonadConnectorQuery$fMonadConnectorImage$fApplicativeConnectorQuery$fApplicativeConnectorImage$fFunctorConnectorQuery$fFunctorConnectorImage$fUConvertLocImage$fTranslateLocImage$fScaleLocImage$fRotateAboutLocImage$fRotateLocImage$fDecorateLocImage$fDrawingCtxMLocQuery$fDrawingCtxMLocImage$fMonoidLocQuery$fMonoidLocImage$fMonadLocQuery$fMonadLocImage$fApplicativeLocQuery$fApplicativeLocImage$fFunctorLocQuery$fFunctorLocImage$fLocDrawMGenLocDrawing$fMonoidGenLocDrawing$fUserStateMGenLocDrawing$fDrawingCtxMGenLocDrawing$fMonadGenLocDrawing$fApplicativeGenLocDrawing$fFunctorGenLocDrawing$fBranchCursorMGenLocTrace$fCursorMGenLocTrace$fInsertlMGenLocTrace$fLocationMGenLocTrace$fMonoidGenLocTrace$fUserStateMGenLocTrace$fDrawingCtxMGenLocTrace$fMonadGenLocTrace$fApplicativeGenLocTrace$fFunctorGenLocTrace$fUserStateMGenTraceDrawing$fDrawingCtxMGenTraceDrawing$fMonadGenTraceDrawing$fApplicativeGenTraceDrawing$fFunctorGenTraceDrawingPicture$fMonoidCtxPicture$fAlignSpaceCtxPicture$fAlignCtxPicture$fCatSpaceCtxPicture$fConcatCtxPicture$fZConcatCtxPicture$fTranslateCtxPicture$fScaleCtxPicture$fRotateAboutCtxPicture$fRotateCtxPicture$fMonoidAdvObject$fDrawingCtxMAdvObject$fMonadAdvObject$fApplicativeAdvObject$fFunctorAdvObject $fMonoidDAV$fUConvertLocThetaImage$fDecorateLocThetaImage$fDrawingCtxMLocThetaQuery$fDrawingCtxMLocThetaImage$fMonoidLocThetaQuery$fMonoidLocThetaImage$fMonadLocThetaQuery$fMonadLocThetaImage$fApplicativeLocThetaQuery$fApplicativeLocThetaImage$fFunctorLocThetaQuery$fFunctorLocThetaImageWumpus.Core.PicturevertexPrimPathcurvedPrimPathostroke textlabel rtextlabel escapedlabel rescapedlabel hkernlabel vkernlabel$fAlignSpaceGenPosObject$fAlignGenPosObject$fCatSpaceGenPosObject$fConcatGenPosObject$fZConcatGenPosObject$fUserStateMGenPosObject$fDrawingCtxMGenPosObject$fMonoidGenPosObject$fMonadGenPosObject$fApplicativeGenPosObject$fFunctorGenPosObject semicircleCW$fMonoidCatTrail$fFunctorTrailSegment$fMonoidGenChain$fLocationMGenChain$fUserStateMGenChain$fDrawingCtxMGenChain$fMonadGenChain$fApplicativeGenChain$fFunctorGenChain$fMonadFontLoadIO$fFunctorFontLoadIO