3{M      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl m n o p q r s t u v w x y z { | } ~                                                                                                                                                        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABC D E F G H I J K L "MN9Set the X Window cursor for a window to a specified type O  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  %123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~)('&" $#!+0,.-/*! PQRSTUVWXYPUVWXYPUVWXY/The class of types that can be pretty-printed. 2 pretty x is a pretty String representation of x. F prettyList prefix infix postfix xs is a pretty String representation C of the list xs, with prefix, infix, and postfix specifying the 0 punctuation. For example, if (pretty x) => x,  then prettyList [ ,  ] [x, x, x] =>  [x, x, x]. 0Minimal complete implementation: define pretty.    Indent a single line n spaces.  (sepLines is like unlines, but omits the n at the end of the  last line.  .sepLines2 is like sepLines, but adds an extra n between each  pair of lines so they are double spaced. -Separate strings by commas and nothing else (,) 'Separate strings by commas and spaces (, )                  D2Operator priority, actually should be > 0 or >= 0  Python operator, such as * or +  associative? !Python function formal parameter (Python identifier (variable name, etc.) Python expression variable identifier  (binary operation: operator, left, right  base cases !Qfunction call: function expression (typically a PVariable), argument expressions "+expression in parentheses; is this needed? # if: condition, value, alt-value $Python statement %'function name, formal parameters, body &if condition action alt-action 'import statement ()3Python module -- essentially a list of statements;  should it also have a name? *Z7The class of types that can be parenthesized, that is, E they may contain parentheses, and their parentheses may be altered.  class Parenthesize a where / alterParens :: (PExpr -> PExpr) -> a -> a  ^^ Don't need a class for this! [+3Alter the parentheses of a statement by applying a 4 transformer t to the expressions in the statement. ,-.Python return statement /Python if STATEMENT 0Python if EXPRESSION 1Python variable 2Python identifier 3Python integer expression 4Python float expression 5Python boolean expression 6CPython character expression = string expression with one character 7Python string expression 8"Python expression in parentheses. 9/Remove all grouping parentheses in expression. = Does not affect parentheses required for function arguments  or parameters. * This will sometimes alter the semantics. :1Wrap each subexpression in grouping parentheses. 5 This will typically look like too many parentheses. ;+Use parentheses for grouping where needed, E but cautiously, erring on the side of extra parentheses if not sure  they can be removed. <:Remove grouping parentheses that are provably not needed. = This may not remove *all* unnecessary grouping parentheses. 2 You can always add more cases to make it better! \<Various rules for removing extra parentheses in operations. > Probably incomplete. If the PExpr is not an operation, then ' it is passed through without change. ]^=+Adding and removing top-level parentheses. 1 Axioms: par (unpar e) == e; unpar (par e) == e. 7Add parentheses around an expression. Top level only. >:Remove parentheses around an expression. Top level only. _The operator precedence of an expression. 5 If the expression is an operation, then this is the  precedence of its operator;  otherwise, it'0s not clear what it should be, but for now, -1. ? Python function call expression @!Python function formal parameter ADefines function definition BCBinary operators 8 Precedence levels are rather *informally* described in  The Python Language Reference,  http:docs.python.org reference. / I am adopting the infixr levels from Haskell, * which seem to be consistent with Python, / at least for the operators that Sifflet uses. Arithmetic operators ' + and - have lower precedence than *, , /, % DEFGHI?Comparison operators have precedence lower than any arithmetic  operator. Here, I'"ve specified associative = False,  because association doesn't even make sense; - (a == b) == c is in general not well typed. JKLM> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLM>)*$('&%#"! +,-./0123456789:;<=>?@ABCDEFGHIJKLM> #"!  !"#$('&%%&'()**+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU3Enclose in parentheses, like a Lisp function call.  Example: par foo [x, y] =  (foo x y) V+Write a list of words, separated by spaces W/Write a list of words, not separated by spaces XYZ[;Signal an error using a list of strings to be concatenated \;Signal an error using a list of strings to be concatenated  with spaces between (unwords). ](Generalization of map to lists of lists ^)Generalization of mapM to lists of lists _.Insert an item into a list of lists of items, 0 making it the last element in the last sublist `>Insert an item in a list of items, making it the last element a6Update a value at a given key by applying a function.  Similar to Data.Map.adjust. b'Monadic generalization of adjustAList NOPQRSTUVWXYZ[\]^_`abNPOQRSTUVWXYZ[\]^ab_`NPOOPQRSTUVWXYZ[\]^_`abc`atext for the expander button b*use the root to add rpanel to a container cids of widgets added, in rows dframe, same as root e expander fvbox to contain the rows g"next element goes here if it fits hfree width in current row imaximum row width jhorizontal padding kdefgh>Given a list of (name, widget) pairs, add each of the widgets  and its name to the rpanel i(Add a single named widget to the RPanel j$Force the RPanel to begin a new row kCGiven a list of lists, each sublist representing a row of widgets, = add the widgets to the RPanel, preserving the row structure  as much as possible. A (Row structure will be broken if any intended row is too wide.) l#Add a row of widgets to an RPanel. 8 This does not start a new row before the first widget, C but after the last, so at the end, the current row will be empty. cdefghijk cgdefihjk cdefghijk lmmno%Show a message and a set of choices; 6 run the action corresponding to the selected choice;  you might want to include a Cancel# option with the action return (). 9 There *should* be as many actions as there are options. npWhere to put a dialog window.  Possible values are 9 WinPosNone WinPosCenter WinPosMouse WinPosCenterAlways  WinPosCenterOnParent q,Customizable framework for running a dialog rostuvwxpy&Add a labeled text entry to the vbox. lmnopqrstuvwxynoprqstuvlmwxylmnopqrstuvwxy z{|;class Repr: representable by a String or a list of Strings (repr x is a String representation of x.  reprl x is a [String] representation of x, 9 where the first element should be the same as repr x, . and the rest provide auxiliary information % that you want to be shown with x. 7 reprs x is a reduction of reprl x to a single String. H reprList prefix infix postfix xs is the representation of a list of xs ?Minimal complete implementation: define repr, or define reprl. : The normal way is to define repr. Define reprl instead, ? if for some reason you want to include additional information ; such as the value of an expression in an expression node.  Examples:  - (3 :: Int) has repr => 3 , reprl => [3] , reprs => 3 2 - In Sifflet.Language.Expr, (ENode (NSymbol x) (EvalOk (3 :: Int)  has reprl => [x, 3] , reprs => x 3, and repr => x.  - reprList (   ) [3 :: Int, 4, 5] => (3 4 5) }~z{|}~|}~z{z{{|}~}~ z{|}~|}~z{  @A Number represents a real number, which can be exact (Integer)  or inexact (Double). Tell whether a Number is exact 2Take a number, which may be exact or inexact, and - produce the inexact number which equals it. 2 Note that there is no inverse function toExact, J because some inexact numbers like 3.5 are not equal to any exact number. E The class RealFrac provides methods round, ceiling, floor, truncate " for converting to exact numbers. qr'Unary operations fall into two groups: + exactOp1 works only for an exact operand; 4 it is an error if the operand is inexact. & The result is always exact.  (Unused) 3 inexactOp1 works directly for an inexact operand; C otherwise by conversion of its exact operand to inexact; ( the result is always inexact. 6 eitherOp1 works for either exact or inexact operand, G and the result is exact if and only if the operand is exact. stu$Binary operations fall in 3 groups: 9 exactOp2 is implemented only for exact, exact operands;  if there's any inexact operand, it' s an error. < Integer division operations (quot, rem, div, mod) 6 are like this. The result is always exact. = eitherOp2 is implemented directly for exact, exact operands ; and inexact, inexact operands; if one operand is 9 exact and the other inexact, the exact operand ? is converted to inexact. Most arithmetic operations H (+, -, *) are like this. The result may be exact or inexact. C inexactop2 is directly implemented for inexact, inexact operands, C but handles exact operands by converting them to inexact < (even if both are exact). Math functions such as = exp, log, sqrt, and sin are like this. The result  is always inexact. vwxy z{|@An Environment contains variable bindings and may be linked to  a next environment FPerhaps it may also be used to generate Vp type variables (with int id's) <A function may have a name and always has an implementation =A collection of functions, typically to be saved or exported  or read from a file A more highly parsed type of expression ELit (literals) are  primitive (self-evaluating) expressions, A in the sense that if x is a literal, then eval x env = EvalOk x  for any environment env.  I'Gve restricted function calls to the case where the function expression A is just a symbol, since otherwise it will be hard to visualize. 9 But with some thought, it may be possible to generalize  this to  ECall [Expr] -- (function:args) }~ Example:  ePlus_2_3 = eCall + [eInt 2, eInt 3] 3Convert an expression tree (back) to an expression F It will not give back the *same* expression in the case of an EList. 4The value of an expression in the base environment. &Try to match a single type and value, < may result in binding a type variable in a new environment  or just the old environment Determine the type of a value.  May result in a type variable. FCheck whether the values agree with the types (which may be abstract) >This is *probably* too lenient in the case of type variables:  it can pass a mixed-type list. =Type type of a function, a tuple of (arg types, result type) 7Insert names and values from lists into an environment 0Get the value of a variable from an environment -List of all symbols bound in the environment :List of all symbols bound to functions in the environment %All the functions in the environment 0Return to the environment prior to an extendEnv ;Apply a function fvalue to a list of actual arguments args ? in an environment env and with a limited stack size stacksize      9Integer div and mod operations, for exact integers only. 9 Using an inexact (floating point) argument is an error,  even if the argument is equal to an integer (e.g., 5.0). , Division (div or mod) by zero is an error. Floating point division. 2 Integer arguments are coerced to floating point, * and the result is always floating point.  operands are ints.  x /7 0 is NaN if x == 0, Infinity if x > 0, -Infinity if x < 0. APrimitive function with 2 number arguments yield an number value : fi = integer function to implement for integer operands. 6 fx = float function to implement for float operands. +Primitive unary functions number to number ;Given an expression, return the list of names of variables  occurring n the expression 9exprVarNames expr returns the names of variables in expr C that are UNBOUND in the base environment. This may not be ideal,  but it' s a start. =decideTypes tries to find the argument types and return type 8 of an expression considered as the body of a function, 9 at the same time checking for consistency of inputs and . outputs between the parts of the expression. 8 It returns Right (argtypes, returntype) if successful;  Left errormessage otherwise. ~     ~     ~      &6grossProfit salesA salesB = 0.12 salesA + 0.25 salesB $bonus1 profit = if profit > 100000 / then 1000 + 0.0012 * profit  else 0 :bonus2 salesA salesB = bonus1 (grossProfit salesA salesB) foo a b = 2 * a + b )An expression representing a call to foo !max x y = if x > y then x else y )An expression representing a call to max 2fact n = if n == 0 then 1 else n * (fact (n - 1)) *An expression representing a call to fact sum of the integers 0..n C Lewis and Loftus, Jave Software Solutions, 6th. ed. (they call it sum) +rmul: multiplication by repeated addition.  The multiply function in Hanly and Koffman,  'Problem Solving and Program Design in C , 5th ed. *An expression representing a call to rmul Even and odd, the slow way. @ Springer and Friedman, Scheme and the Art of Programming (??). 4 Rubio-Sanchez, Urquiza-Fuentes, and Pareja-Flores,  )A Gentle Introduction to Mutual Recursion, > in ITiCSE 2008: The 13th SIGCSE Conference on Innovation and 1 Technology in Computer Science Education, 2008. +Fibonacci series through mutual recursion. 4 Rubio-Sanchez, Urquiza-Fuentes, and Pareja-Flores, Gentle Introduction ;This function will be in error if the function name is not  found in exampleEnv.  =The type of a function to export (user) functions to a file.    '!Simplifying parentheses < This belongs elsewhere, since non-Haskelly things can also  be instances. "#1User configurable options for export to Haskell.  Currently just a place-holder. $%+The default options for export to Haskell. &2Export functions with specified options to a file  Work needed: add a declaration import Sifflet.Data.Number. 'Shortcuts for Hs*** data constructors, % with lots of defaults for features I' m not using. 7There is no source location in the conventional sense. A Haskell module. A Haskell import declaration 0A function binding (declaration and definition) &Identifier, as the name of a function #Symbol, as the name of an operator 8Pattern variable, as in the argument list of a function  (pattern match) CA variable used in an expression (rather than in an argument list) An infix operator application. # Probably needs parentheses added. A prefix function application. 2 Need to work some parentheses in here, probably. An infix operator 'A clause of a function binding  hsMatch :: ?? *Converting Sifflet to Haskell syntax tree 2Create a module from a module name and Functions. (&Create a declaration from a Function. 9 Needs work: infer and declare the type of the function. )*$Map Sifflet names to Haskell names. E Returns the variant HsSymbol for operator names, HsIdent for others $ (function names, variables, etc.). K This might need to be extended with fixity and associativity information, @ but that can come later when I start to deal with parentheses. #Is an expression atomic? Yes if it's a value, a boolean value J (i.e., the unary constructor True or False), or a literal; otherwise no. > Actually *any* unary constructor could be considered atomic,  but I'/m not sure how to deal with this. Not urgent, E since Sifflet export uses no unary constructors but True and False. Facilities for testing +6Test export of an example function, specified by name !"#$%&'()*+ #$!"%&'()*+ !""#$$%&'()*+ ,Options for Python export. : Should probably include choices like Python2 or Python3; @ if statement or if expression. Right now, just a placeholder. -./014Convert Sifflet name (of a function) to Python name 2=Remove characters that are not valid in a Python identifier, 8 and in some cases, insert other characters to show what' s missing 34567 ,-./01234567 ,-./01234567 ,--./01234567"89:-use explicit lambda in function definitions,  (define f (lambda (a b) ...) ;<=>?@ABCDEFG An SExpr is flattish if it is an atom & or is a list containing only atoms, % where the empty list () is an atom. HIJKLMNNewline and indent O+Convert Sifflet Functions to Scheme SExprs P+Convert Sifflet Functions to pretty Scheme Q.Convert a FunctionDefTuple to a Scheme SExpr. * Use the form (define (name . args) body) 7 except when there are zero arguments, which becomes a ) Scheme constant rather than a function,  use (define name expr). R#Export functions to a Scheme file. The path to the  sifflet.scm file.   89:;<=>?@ABCDEFGHIJKLMNOPQRDFE<CBA@?>=; 89:GHIJKLMN OPQR89:9:;<CBA@?>==>?@ABCDFEEFGHIJKLMNOPQRSCParse a Sifflet data literal (number, string, char, bool, or list) T=Parse a Sifflet input containing exactly one data expression ! possibly flanked by white space U*Like expr, but consumes the entire input, @ so there must not be any extraneous characters after the Expr. V'nothingBut p is like p!, but consumes the entire input, : so there must be no extraneous characters (except space)  after whatever p parses. W Parse a Sifflet data expression XYZ-Parser for a Value of any type (any VpType), = except that we cannot parse as VpTypeVar or VpTypeFunction. [4Parser for a value with a specific VpType expected. 3 Again, we cannot do this for VpTypeVar (why not?)  or VpTypeFunctiopn 7A name for the type, for use in parser error reporting \]^_`aSTUVWXYZ[\]^_`aSTUVWXYZ[\]^_`aSTUVWXYZ[\]^_`aAn XMLConsumer consumes XML An XMLProducer produces XML bcdefbcdefbcdefbccdef*g3A Translate is a thing that can be repositioned by  delta x and delta y hdelta X delta Y thing in old position thing in new position ij8Make an object have at least a specified minimum width;  does nothing if it's already at least that wide k5BBox x y width height; (x, y) is the top left corner lmnopqrstuvwxyz{|}~BBox accessors and utilities *Form a new BBox which encloses two bboxes *ghijklmnopqrstuvwxyz{|}~*uvwxyz{|qrst}mnopkl~ijgh*ghhijjkllmnopnopqrstrstuvwxvwxyz{|}~An Iolet is a circular port.  Other shapes could be added. ftExtents: used for what?  tree style top left after padding the tree being laid out  (actually we don' t need the tree as an argument;  it's implied by the GNode tree)  node sizes  tree Sizes %Center a GNode in a rectangular area  y y y   5What is a FunctoidLayout? You can think of it as a  tree layout for a Frame, 4 or for a Functoid, or as a Forest of Tree Layouts! A For an Edit frame, it must be a forest, since the nodes are not ( yet necessarily connected into a tree. D For a call frame, it will be a single TreeLayout (singleton list).    ?A Functoid is either a FunctoidParts, representing a partially 7 defined function, or a (completely defined) Function. > A FunctoidParts represents an incompletely defined function, G which has a function name, argument names, and a list of graph nodes 9 representing the function body which might not yet form / a complete expression tree, e.g., nodes might  be unconnected. "Graphically lay out the Functoid. - mvalues: Nothing implies an uncalled frame, E Just values implies a called frame, even with 0 arguments.               +Two kinds of WNodes: ? A WSimple node represents a node in an expression tree, e.g., if, + M A WFrame node represents a panel or frame that displays an expression tree, & function call, or something similar.  !"=A WGraph consists of WNodes with (sort of) Int-labled edges; 8 the edge labels serve to order the children of a node. #$-Insert new node with given label into graph,  without any new edges; 0 return the new graph and the new node (number) %8Remove a node from the graph; return the updated graph. &?Connect parent to child, using inlet as the order of the child @ (0, 1, ...). outlet is ignored, since there is only outlet 0.  As rendered, the parent'"s inlet-th inlet will have a line  to the child's outlet-th outlet. E This is achieved by inserting a labeled edge (parent, child, inlet) = and clearing any incompatible edge. The incompatibles are: : a. from same parent on same inlet to a different child. B b. from the same parent on a different inlet to the same child. = c. from same child (on same outlet) to a different parent. BNOTE: This is confusing, because, from the data flow perspective, ; data flows OUT of the child INTO the parent, but from the   tree in graph3 perspective, links are directed OUT of the parent  INTO the child. So beware! '(Removes a link between parent and child 4 where the edge was labeled inlet (order of child). + Ignores outlet, which should always be 0. / If child is not the inlet-th child of parent, 6 well, this is an error, but grDisconnect ignores it. ( If toFrameP is true, the child node is % reconnected as a child to its frame ()*7Extract from a graph the expression with root node n,  returning a Tree of ExprNode. D Use only the WSimple nodes of the graph (and n had better be one). +1Finding characteristics of the WNodes in a graph ; It is an implicit error if there is no label for the node =wlab is like lab with no Maybe: the node *must* have a label ,/llab is the tree layout node of a WSimple node -+The ExprNode represented by the graph node .The repr of the node's value /6The result of an evaluated node in an expression tree 0The node's BBox 123=Finding the children (nodes, numbers) of a node in a graph : K all children, only WSimple-labeled children, only WFrame-labeled children ? When constructing the graph, ordered children of a tree node 7 get graph node numbers in ascending order; therefore, : sorting the graph nodes gives back the original order of : children in the tree (plus WFrames that are added later, 7 and those should always be after the simple children) 456789(An open node has a WFrame-labeled child :9The graph node of the frame that contains the given node ;The parent (if any) of a node <=CReplace the tree embedded in graph g with root n, with a new tree. >AExtract just the single tree layout node of the given graph node ?BExtract the tree layout (tree) descended from the given root node @7Translate the nodes forming a tree with the given root ABC'Replace the label of a node in a graph DGet the parts of a Functoid. + See note on functionToParts (just below).  Seems to be unused *** E!Convert a function to its parts.  COULDN'!T THIS BE DONE USING the function's implementation, C and not need to use the graph? Then this could go in Functoid.hs / without circular import between it and WGraph ) !"#$%&'()*+,-./0123456789:;<=>?@ABCDE) !"#$%(&')*>?+,-./0123475689:;<=ABC@DE) !!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO3List of the nodes children, ordered by edge number PQRSTUVWFGHIJKLMNOPQRSTUVWFGHJKQRIMNOPLSTUVWFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeXYZ[\]^_`abcde^_X]\[ZYbadec`X]\[ZYYZ[\]^__`abcdefghijkfghijkfghijkfghijk%lmno;A CanvFrame represents (indirectly, through cfRoot, and we 7 access to the graph which is provided by the VCanvas)  a subgraph such as the expression tree 0 of a function which is being edited or called. pqtop area of the frame r bottom area svariable (parameter) names t#the node opened to make this frame u#this frame as a node in the graph; ' also serves as the ID of the frame. venvironment for evaluation w2box of the whole frame (header, tree, and footer) x(0 = bottom level, 1 = next higher, etc. yincludes tlo for an edit frame zedit or call frame {6Use levelOrder for sorting frames before drawing them |,The root of the tree displayed in the frame } A frame is  eval ready2 -- that is, okay to run the Eval Frame dialog -- & if it is a call frame with no parent ~AWhere to position a new frame that is grown out of an old frame? + This is a very rough draft of frameOffset 8argIoletCounter returns (no. of inlets, no. of outlets) B derived from the argument list of a function still being defined Aligning a CanvFrame'0s header and footer with the body of the frame. G Aligns the header above, and the footer below, the body of the frame, - also matching the width if the body widened KFigure out the frame layout for a function. Returns the layout and frame. % Currently, the frame is marked as a  call frame; if you want to edit it, ! call (editFrame? editFunction?) lmnopqrstuvwxyz{|}~opqrstuvwxyzlnm}~|{lnmmno pqrstuvwxyzpqrstuvwxyz{|}~X:A Dragging keeps track of the object (node) being dragged ! and the current mouse position. 7A canvas that can display multiple boxes representing . expressions or function definitions or calls :ToolContext: The way a tool should be applied depends on  where it is being used 3ToolOp a is intended for a = VPUIWindow or VCanvas  type ToolOp a * = VPUI -> a -> ToolContext -> [Modifier] -> Double -> Double -> IO a ;A Toolbox is a framed VBox with a set of Toolbars attached BToolkit functions are organized in groups (rows) for presentation  in a toolbox container of the rest  the canvas 1VPUI: Sifflet (formerly VisiProg) User Interface " The initialEnv is apt to contain builtin functions;  it'1s preserved here so that when writing to a file, 9 we can skip the functions that were in the initial env. all the windows of the program ordered association list,  collections of tools the file opened or to save for windows, canvases, editors $initial value of global environment the global environment )global env as of last file open or save,  used to detect unsaved changes ;Tell whether the global environmkent has changed since the  last file open or save :Extract from the environment the part defined by the user > But you probably want to use Sifflet.UI.Window.UserFunctions  instead of this. "Insert a window in the window map 4Try to get the VPUIWindow with the given window ID,  return Just result or Nothing -Get the VPUIWindow with the given window ID;  it is an error if this fails. +Replace a VPUIWindow with given window ID;  it is an error if this fails. ?Apply an update function to a VPUIWindow with given window ID;  it is an error if this fails. @Apply an update IO action to a VPUIWindow with given window ID;  it is an error if this fails. DRemove a window from the windows map; it has already been destroyed  in the GUI $Try to find canvas; fail gracefully !Find canvas or fail dramatically 6Update the canvas of the specified window, without IO 3Update the canvas of the specified window, with IO 4A helper for making toolOps from actions on VCanvas XZX Commands for the CBMgr FThe CBMgr (Callback manager) encapsulates (in an enclosure, no less!) 9 an IORef VPUI. It is used *solely* to set up callbacks ; and similar stuff in Gtk, where the callback needs access 9 to the IORef. By passing a CBMgr to a function, we can 8 avoid passing the IORef directly, and all the harm and  confusion that could result. .We only need *one* CBMgr for the application; C however, two CBMgrs with the same IORef are logically equivalent, J so there would be no harm in having two as long as they share one IORef. Create the CBMgr <Read an IORef, update with IO, and write the updated value. N This is like modifyIORef, but the type of the second argument is (a -> IO a)  instead of (a -> a).  *=Ask the vcanvas to update the frame and install a new graph. @ Frames are identified by their frame nodes, so the new frame + must have the same frame node as the old. > It is an unreported error if there is not exactly one match. /Like vcUpdateFrameAndGraph, but keep the canvas' s old graph.    Make nothing be selected  The Graph Node of a Selection *What is selected (if anything) at a point Connect nodes Disconnect nodes /Remove the (sub)tree rooted at the given node. ) Removes it from the graph of the canvas * and from the FunctoidParts of the frame. 3Add a frame representing a functoid to the canvas. CUse mvalues = Nothing if you do not want the frame to be evaluated 6 as a function call, otherwise mvalues = Just values. 7prevEnv is *supposed* to be the previous environment,  i.e., that of the  parent, frame or the canvas, not of the new frame, 7 because vcAddFrame itself will extend the environment  with the new (vars, values). 5 But this is odd, because openNode calls vcAddFrame 3 apparently with the *new* environment as prevEnv,  and yet it works correctly. FCaution: I think it is necessary for the canvas to have been realized  before calling this function!  /Return a canvas of at least the specified size & and otherwise like the given canvas.      :Find the node, if any, at a given position on the canvas. CeditFunction: reverse of defineFunction: replace the call frame by J an edit frame; does not change the VPUI (global env.), just the canvas..  Find a frame',s subframes, i.e., those that were expanded , to trace the execution of a function call.  Cannot be in an edit frame. 2Given a graph with a rooted tree, collect list of  subframes, 5 i.e., frames that are children of nodes in the tree CEvaluate the frame, having gotten a list of values from the dialog >vcClearFrame - clear a frame in a canvas; not yet implemented  What does this mean? &Close a frame and any subframes of it ;Close any subframes of the frame, but not the frame itself "Is our canvas editing a function? 4Find the frames that are calling the named function                +argument name function name  !"#$%&'/Check that all required modifiers are in found ()*+,-.3Add a frame representing a functoid to the canvas = of a particular window, specified by its window id (title). /3Add a frame representing a functoid to the canvas < of a VPUIWindow (which ought to have a canvas, of course).  Otherwise like vcAddFrame. 01IOpen an entry for user input of function name to select a function tool. E Returns unaltered VPUI, for convenience in menus and key callbacks. 2,Show an entry for input of a literal value. E Returns unaltered VPUI, for convenience in menus and key callbacks. (New, light replacement for most dialogs "Prompt for input in a text entry. B When the user presses Return, attempt to parse the input text. @ If parse succeeds, apply the toolType to the resulting value 7 to produce a ToolId and set the corresponding tool. ? If user presses Escape, the input is closed with no action. @ If mcompletions is (Just comps), comps is a list of possible  completions for the entry. IReturns the vpui, with NO UPDATE, for convenience in callbacks and menus 8When activated, send a message to set the current tool Set actions for Tab and Escape 3+For debugging (frame context menu command) 4+For debugging (frame context menu command) 5For debugging the window's widget children 6(Clear frame indicated by mouse location 7#Close frame (context menu command)  !"#$%&'()*+,-./01234567  '-0(,&)*+%12!"/.$#34567   !"#$%&'()*+,-./012345678Create a new VPUI.  This used to set up the basic  q to quit and  on exposed callbacks, " but now does not even do that.  The  function argument ( may perform additional initialization;  if there is none, simply use . 9 Create a new main' workspace window, with a given style. I The second argument should set up a menu bar and place it on the vbox, % or do nothing if no menu is wanted. :;<Add Apply and Close% buttons to a function-editor window  !?fedFuncFrame generates a throw-away frame for the sole purplse > of obtaining its measurements before initializing the canvas ">If mViewSize is Nothing, no scrollbars are put on the canvas, 3 and its display size request is its natural size. B If mViewSize = Just viewSize, then scrollbars are wrapped around 9 the canvas, and its displayed size request is viewSize. = addMenuBar is an action which, if desired, adds a menu bar;  if you don't want one, just pass ( _ -> return ()). =#%List of all window ids of the vpui, >Perform action on all windows & (actually (WinId, VPUIWindow) pairs. 9 Returns updated VPUI (in case any windows are changed). ?CThis function is called either when a window *has been* destroyed,  with destroy = False, > or when you *want to* destroy a window, with destroy = True. =removeWindow actually *closes* the window if destroy = True, % as well as removing it from the vpui's windows map. @6Context menu command to apply the function definition  of an EditFrame. Execute4 the definition currently represented in the frame, 8 i.e., bind the function name in the global environment 0 to the function definition found in the frame. $GIn the workspace window, update each frame calling the named function , to reflect the current function definition %=In the canvas, update a call frame with the current function : definition from the environment, returning a new canvas. N Root call frames are torn down and rebuilt with the new function definition. H Call frames that are called by other call frames are simply torn down. AB 89:;<=>?@AB 89:;<@A?=>B 89:;<=>?@AB T&' help or quit (modify VPUI with IO )start a dialog * set a tool +,-./01C9Finding, creating, and initializing windows (VPUIWindow) &Find and show a window, if it exists. 0 If not, create the window, put it in the vpui's window map, K and initialize it and any auxiliary objects using the initWin function. 1 The 3rd argument of initWin will be the window' s title. 0 Always presents the window (shows and raises). 8 Returns a 3-tuple: the VPUIWindow contains the Window, 1 and the Bool value is True if the Window is new 9 (and therefore might need some further initialization). 8 The third tuple element is an IORef to the VPUIWindow; < it may be useful for setting up signal and event handling. 2Default  do-nothing add-callbacks function DEFShow a workspace window, with a given title, _not_ editing a function FFShow a workspace window with a given title and maybe function to edit 3Initialize a Workspace window. L Called in sifflet.hs:Main from showWindow called from showWorkspaceWindow. 4G4Show a function editor window = a workspace window  editing a given function. D Use argNames for a new function; ignore them if funcName is bound. H5I6789:;<BAdd a tool button to the function pad window in a specified panel J.Ask user for new function name and arguments, " then begin editing the function. =Quit from Sifflet >,Open a file (load its function definitions) ?COffer to save changes, if any, and continue with the continuation. @ The continuation gets the current vpui if there are no changes ; or if the offer to save is rejected; otherwise, it gets a 1 vpui which knows it has saved its last changes. : The message, if any, is a confirmation that the file was 9 saved and that we are going on to the next operation -- ) useful for open file, but not for quit. @DContinue with opening the file, after having possibly saved changes ABCDImplements File menu Save command. EImplements File menu Save as command. F4Unconditionally save user functions in SiffML file. . Called from menuFileSave and menuFileSaveAs. ' Updates vpuiFilePath and vpuiFileEnv. G.The user-defined functions of the environment H!Export user functions to a file,  given an exporter and a path,  returning the vpui unchanged. I&Export user functions to Haskell file J%Export user functions to Python file K%Export user functions to Scheme file LCChoose an output file, for file save, save as, and export commands MNOText shown by the help dialog PShow the help dialog QHow to report bugs RSTText for the About dialog UThe software version number. - See ACTION: RELEASE CHECKLIST for a list of < places where this version number needs to be synchronized. VKW8Context menu command to edit the function displayed in  a CallFrame X9Create a new function, add it to the global environment > with body undefined, and start editing it in a new window.  Also update and show  My Functions toolbox and  update its toolkit. YZHandle the Configured event. [\=Handle the Exposed event, should be called only for a window  with a canvas ]9Key bindings map. This is derived from keyBindingsList. ^;KeyBinding list for workspace and function editor windows. _(Unused argument needed for key bindings L"Help text built from key bindings `!What to do when a key is pressed abcdBHandle the ButtonPress event. Should be called only for a window  with a canvas. e"Handles button pressed in a frame f.Handles button pressed in the body of a frame D frameBodyButtonPressed needs VPUIWindow because it calls a toolOp. 7 mb (mouse button) is unused, but might be used later. g5Handles left button pressed in the footer of a frame h Handles beginning of mouse-drag iHandle mouse move event jklmn0Show a context menu for mouse click in a frame. o8Options for context menu that depend on the frame type. CDEFGHIJKL CDEFGHIJKL CDEFGHIJKL"  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~cdefghijklmnopqrstuvwxylmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLp#$%#$&#$'#$()*+),-),.),/),0),1),2),3),4),567867967:67;67<6=>6?@6?A6?B6?C6?D6?E6?F6?G6?H6?I6?J6?K6?L6?M6?N6?O6?P6QR6ST6UV6UW6XY6Z[6Z\6Z]6Z^6Z_6Z`6Za6bc6bd6be6bf6bg6bh6bi6bj6bk6bl6bm6bn6bo6bp6bq6br6bs6bt6bu6bv6bw6bx6by6bz6b{6b|6b}6b~6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b666666666666666666666666666666666666666666666666666666666666666666 6 6 6 6 666666666666666666 6!6"6#6$6%6&'6&(6&)6&*6&+6&,6&-6&.6&/6&06&16&263463563663763863963:63;63<63=63>63?63@63A63B63C63D63E63F63G63H63I63JKLMKLMNOPQRSTUVWXYZ[\]]^_`aabbcdefghijklmnopqrrstuvwxyz{|}~                                                                                                        ! " # $ % & ' ( ) * + , - . / 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 bcdeefghijklmmnopqrstuvwxxyz{|}~}oo      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi j k l m n o p q r stuv!w!x!y!z!{!|!}!~!!              n                                                       t      !"#$%&'()*+,-./0123456789:;<=>?@A?BCDEFGHIJ K L M N O P 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 { | } ~                     sifflet-lib-1.0Sifflet.Data.TreeSifflet.UI.LittleGtkSifflet.Language.ParserSifflet.UI.GtkForeignSifflet.Text.PrettySifflet.Foreign.Python Sifflet.UtilSifflet.UI.RPanelSifflet.UI.GtkUtilSifflet.Text.ReprSifflet.Data.NumberSifflet.Language.ExprSifflet.ExamplesSifflet.Foreign.ExporterSifflet.Foreign.ToHaskellSifflet.Foreign.ToPythonSifflet.Foreign.ToSchemeSifflet.Language.SiffMLSifflet.Data.GeometrySifflet.Data.TreeLayoutSifflet.Data.FunctoidSifflet.Data.WGraphSifflet.Data.TreeGraphSifflet.Rendering.DrawSifflet.Rendering.DrawTreeGraphSifflet.UI.FrameSifflet.UI.TypesSifflet.UI.CallbackSifflet.UI.CanvasSifflet.UI.ToolSifflet.UI.WorkspaceSifflet.UI.WindowPaths_sifflet_lib Sifflet.UIcontainers-0.3.0.0 Data.Tree subForest rootLabelNodeTree glib-0.11.0System.Glib.SignalsonSystem.Glib.Attributesgetset:=:~:=>:~>::=::~AttrOp gtk-0.11.0Graphics.UI.Gtk.General.General grabRemovegrabAddmainQuitmainGUIinitGUIGraphics.UI.Gtk.Gdk.DrawWindowdrawWindowInvalidateRectGraphics.UI.Gtk.Abstract.Widget onSizeRequest onDestroy keyPressEvent exposeEventbuttonPressEvent widgetVisiblewidgetSetCanFocuswidgetSetSizeRequestwidgetSetDoubleBufferedwidgetClassPathwidgetAddEvents widgetSetNamewidgetGrabFocuswidgetSizeRequest widgetDestroy widgetShowAll widgetShowGraphics.UI.Gtk.Buttons.ButtonbuttonNewWithLabel%Graphics.UI.Gtk.MenuComboToolbar.Menu menuPopupGraphics.UI.Gtk.Display.Label labelSetTextlabelNew+Graphics.UI.Gtk.Selectors.FileChooserDialogfileChooserDialogNewGraphics.UI.Gtk.Windows.Window windowTitle windowMove windowPresentwindowSetPositionwindowSetDefaultSizewindowSetTitle windowNewGraphics.UI.Gtk.Gdk.CursorXCursorArrowBasedArrowDown BasedArrowUpBoatBogosityBottomLeftCornerBottomRightCorner BottomSide BottomTee BoxSpiral CenterPtrCircleClock CoffeeMugCross CrossReverse Crosshair DiamondCrossDotDotbox DoubleArrow DraftLarge DraftSmall DrapedBoxExchangeFleurGobblerGumbyHand1Hand2HeartIcon IronCrossLeftPtrLeftSideLeftTee LeftbuttonLlAngleLrAngleMan MiddlebuttonMousePencilPiratePlus QuestionArrowRightPtr RightSideRightTee RightbuttonRtlLogoSailboat SbDownArrowSbHDoubleArrow SbLeftArrow SbRightArrow SbUpArrowSbVDoubleArrowShuttleSizingSpiderSpraycanStarTargetTcross TopLeftArrow TopLeftCornerTopRightCornerTopSideTopTeeTrekUlAngleUmbrellaUrAngleWatchXterm LastCursor BlankCursorCursorIsPixmap CursorTypeGraphics.UI.Gtk.CairorenderWithDrawableGraphics.UI.Gtk.Windows.DialogdialogSetDefaultResponsedialogAddButton dialogRun dialogNew%Graphics.UI.Gtk.Windows.MessageDialogmessageDialogNew MessageInfoMessageWarningMessageQuestion MessageError MessageOther MessageType ButtonsNone ButtonsOk ButtonsClose ButtonsCancel ButtonsYesNoButtonsOkCancel ButtonsType!Graphics.UI.Gtk.Display.Statusbar statusbarPop statusbarPushstatusbarGetContextId statusbarNewGraphics.UI.Gtk.Entry.EntryentryGetCompletionentrySetCompletion entryGetText entrySetTextentryNew%Graphics.UI.Gtk.Entry.EntryCompletionentryCompletionModelentryCompletionInsertPrefixentryCompletionSetTextColumnentryCompletionNew#Graphics.UI.Gtk.ModelView.ListStore listStoreNew#Graphics.UI.Gtk.ModelView.TreeModelmakeColumnIdString%Graphics.UI.Gtk.ModelView.CustomStorecustomStoreSetColumn%Graphics.UI.Gtk.Selectors.FileChooserfileChooserGetFilenameFileChooserActionOpenFileChooserActionSaveFileChooserActionSelectFolderFileChooserActionCreateFolderFileChooserActionGraphics.UI.Gtk.Layout.HBoxhBoxNewGraphics.UI.Gtk.Layout.Layout layoutSetSize layoutPut layoutNewGraphics.UI.Gtk.Layout.ExpanderexpanderSetExpanded expanderNewGraphics.UI.Gtk.Layout.VBoxvBoxNewGraphics.UI.Gtk.Ornaments.FrameframeNew(Graphics.UI.Gtk.Scrolling.ScrolledWindowscrolledWindowSetPolicyscrolledWindowNewGraphics.UI.Gtk.Misc.Adjustment adjustmentNewGraphics.UI.Gtk.Misc.EventBox eventBoxNewGraphics.UI.Gtk.Abstract.BoxboxPackStartDefaults boxPackEnd boxPackStart"Graphics.UI.Gtk.Abstract.ContainercontainerChildcontainerForeach containerAddGraphics.UI.Gtk.General.StructslayoutGetDrawWindowdialogGetActionAreadialogGetUpper Requisition ResponseNoneResponseRejectResponseAcceptResponseDeleteEvent ResponseOkResponseCancel ResponseClose ResponseYes ResponseNo ResponseApply ResponseHelp ResponseUser ResponseIdGraphics.UI.Gtk.TypestoDialogcastToContainer DrawWindow WidgetClassLabelContainerClassButtonWindowDialogScrolledWindowExpanderVBoxHBox StatusbarLayoutEntryGraphics.UI.Gtk.General.Enums PackRepelPackGrow PackNaturalPackingPolicyAutomatic PolicyType WinPosNone WinPosCenter WinPosMouseWinPosCenterAlwaysWinPosCenterOnParentWindowPositionGraphics.UI.Gtk.Gdk.Enums ExposureMaskPointerMotionMaskPointerMotionHintMaskButtonMotionMaskButton1MotionMaskButton2MotionMaskButton3MotionMaskButtonPressMaskButtonReleaseMask KeyPressMaskKeyReleaseMaskEnterNotifyMaskLeaveNotifyMaskFocusChangeMask StructureMaskPropertyChangeMaskVisibilityNotifyMaskProximityInMaskProximityOutMaskSubstructureMask ScrollMask AllEventsMask EventMask pango-0.11.0 Graphics.Rendering.Pango.Structs Rectangleparsec-2.1.0.1"Text.ParserCombinators.Parsec.Prim parseTest setCursor GtkLayoutGtkFramePrettypretty prettyList indentLinesepLines sepLines2sepComma sepCommaSp Precedence POperatoropNameopPrecopAssoc PParameter PIdentifierPExprPStringPBoolPFloatPInt PVariablePOperatePCallPParenPCondE PStatementPFunPCondSPImportPReturnPModule alterParensatomiccompoundretcondScondEvaridentpIntpFloatboolcharstringparennoParens fullParens bestParenssimplifyParensparunparcallparamfunopTimesopIDivopFDivopModopPlusopMinusopEqopNeopGtopGeopLtopLeSuccFailFailSuccparsefparseInt parseDouble parseVerbatim putCatsLnputCatLninfofakestuberrcaterrcatsmap2mapM2insertLastLast insertLast adjustAList adjustAListMRPanelrpanelId rpanelRoot rpanelContent newRPanelrpanelAddWidgetsrpanelAddWidget rpanelNewRow rpanelAddRows EntryDialogReadersuppressScimBridgeshowChoicesDialogdefaultDialogPosition runDialogS runDialogMshowInputErrorMessageshowErrorMessageshowInfoMessage showMessagecreateEntryDialogrunEntryDialogaddEntryWithLabelNameReprreprreprlreprsreprListtreeleafisLeaftreeSize treeDepthnameTreeputTreeputTreeR putTreeRsputTreeS drawTreeShowNumberInexactExactisExact toInexactadd1sub1eqZerogtZeroltZerotestItestJtestXtestYEnvFunctionDefTuple FunctionImplCompound PrimitiveFunction FunctionsTypeEnvVpType VpTypeVarVpTypeFunction VpTypeList VpTypeString VpTypeNum VpTypeChar VpTypeBoolValueVListVFunVStrVFloatVIntVCharVBoolEvalRes EvalUntried EvalErrorEvalOk EvalResult ExprNodeLabelNLitNSymbol NUndefinedExprNodeENodeExprTreeExprECallEListEIfELitESymbol EUndefinedOFloatOCharOBoolOStrOIntSymbol stringToExprstringToLiteraleSymboleInteStringeChareFloateBooleFalseeTrueeIfeListeCallexprNodeIoletCounter exprToTree treeToExprexprToReprTreeevalTree unevalTree valueFunction exprToValue stringToValue emptyTypeEnv typeMatchvpTypeOf typeChecknewUndefinedFunction functionName functionNArgsfunctionArgTypesfunctionResultType functionTypefunctionImplementationfunctionArgNames functionToDeffunctionFromDef functionBodyemptyEnvmakeEnv extendEnv envInsertLenvInsenvSetenvGetenvGetFunction envLookupenvLookupFunction envSymbolsenvFunctionSymbols envFunctionsenvPopevalapplyePluseTimeseMinuseDiveModeAdd1eSub1eEqeNeeGteGeeLteLeeZerop ePositivep eNegativepbaseEnv exprSymbols exprVarNames decideTypesundefinedTypesfooeFooeMaxeFactexampleFunctionsexampleFunctionNames exampleEnvgetExampleFunctionExporter HasParensHaskellOptionsdefaultHaskellOptions exportHaskellfunctionsToHsModulefunctionToHsDecl exprToHsExp valueToHsExp prettyModule PythonOptionsdefaultPythonOptions exprToPExpr valueToPExpr nameToPythonfixIdentifierCharsfunctionToPyDefdefToPyfunctionsToPyModulefunctionsToPrettyPy exportPython SchemeOptionsdefineWithLambdaIndentAtom SFunctionSBoolSCharSStringSSymbolSIntSFloatSExprSListSAtomdefaultSchemeOptions exprToSExprfunctionNameToSchemeName valueToSExprexprToSchemeReprexprToSchemePretty exprToSchemeinlfunctionsToSExprsfunctionsToPrettyScheme defToSExpr exportScheme parseExpr parseInput parseSuccFail nothingButexprlistliteralvalue typedValueqcharqstringintegerdoublenumberToXmltoXmlproduceSiffMLFileconsumeSiffMLFilexmlToFunctions Translate translateWidenwidenBBoxSizesizeWsizeH circleCenter circleRadiusPositionposXposY positionDeltapositionDistancepositionDistanceSquaredpositionCloseEnough pointInCirclebbXbbYbbWidthbbHeight bbPositionbbSizebbCenter bbSetWidthbbLeft bbXCenterbbRightbbTop bbYCenterbbBottombbToRect bbFromRectbbMerge bbMergeList pointInBB LayoutNode nodeGNode nodeTreeBB TreeLayoutIolet IoletCounterGNode gnodeValuegnodeTextBoxes gnodeNodeBB gnodeInlets gnodeOutletsTextBoxtbTexttbTextBBtbBoxBBFontTextExtents fontAscent fontDescent fontHeightfontMaxXadvancefontMaxYadvance textXbearing textYbearing extTextWidth extTextHeight textXadvance textYadvanceStyle styleFont lineWidth textMarginhpadvpad exomarginvtinypad styleFramePadstyleNormalTextColorstyleNormalFillColorstyleNormalEdgeColorstyleActiveTextColorstyleActiveFillColorstyleActiveEdgeColorstyleSelectedTextColorstyleSelectedFillColorstyleSelectedEdgeColorstyleTetherColorstyleAuxOffset styleAuxColor styleAuxFontstyleIoletRadiusstyleShowNodeBoxesstyleShowNodePortsVFont vfontFace vfontSlant vfontWeight vfontSizeVColor ColorRGBAColorRGBblackwhitecream lightBluelightBlueGreen lightGray mediumGraydarkGrayyellow darkBlueGreen blueGreenstyleIncreasePaddingstyle0style1style2style3 defaultStylewstylepointInLayoutNode pointInGNodefindRectsetFont measureTextstyleTextExtents ftExtents makeTextBoxtbWidth tbSetWidthtbHeighttbBottomtbCenter tbBoxCenter tbTextCenteroffsetTextBoxCenters gnodeText gnodeTextBBzeroIoletCounter makeGNode makeIolets makeIoletsRow ioletCenter pointInIolet treeSizeslayoutNodeSource layoutRootBB layoutTreeBB treeLayout treeGNodestreeLayoutPaddedSizetreeLayoutSizelayoutTreeMoveCenterTotreeLayoutWidthtreeLayoutWidenFunctoidLayout FLayoutForest FLayoutTreeFunctoid FunctoidFuncfpFunc FunctoidPartsfpNamefpArgsfpNodes functoidNamefunctoidArgNamesfunctoidHeaderflayout flayoutBBox flayoutSize flayoutWidth flayoutBottom flayoutWidenWNodeWFrameWSimpleWEdgeWGraph wgraphNew grInsertNode grRemoveNode grConnect grDisconnectconnectToFrame grAddGraphgrExtractExprTreewlabllab nodeExprNodenodeText nodeValuenodeBBox nodePositionnodeInputValuesnodeAllChildrennodeSimpleChildrennodeAllSimpleDescendantsnodeProperSimpleDescendantsnodeFrameChildren nodeIsSimple nodeIsOpennodeContainerFrameNode nodeParentgrUpdateFLayoutgrUpdateTreeLayoutgrExtractLayoutNodegrExtractLayoutTree translateTreetranslateNodes translateNode grRelabelNode functoidPartsfunctionToParts LayoutGraphflayoutToGraphtreeLayoutToGraphflayoutToGraphRootsorderedTreeToGraphtreeGraphNodesTree nextNodesgraphToOrderedTreegraphToOrderedTreeFromorderedChildrenadjCompareEdgegraphToTreeOriginalgraphToTreeStructuregrTranslateNodegrTranslateSubtreegrTranslateGraphfunctoidToFunctiongraphToExprTreeDrawModeDrawSelectedOutletDrawSelectedInletDrawSelectedNode DrawActive DrawNormalDrawdrawsetColor drawTextBoxdrawBox modeFillCol modeTextCol modeEdgeColgraphQuickViewgraphWriteImageFile graphRender treeRendertreeWriteImageFile gtkShowTree FrameType CallFrame EditFrame CanvFramecfHeadercfFooter cfVarNamescfParent cfFrameNodecfEnvcfBoxcfLevel cfFunctoid frameType levelOrdercfRoot cfEvalReadycfPointInHeadercfPointInFooter frameBodyBox frameNodeAtatLeastSizeFrame resizeFrametranslateFrame frameOffsetnodeCompoundFunctiongrTranslateFrameNodes pointIoletargIoletCounterframeNewWithLayoutDragging draggingNodedraggingPosition SelectionSelectionOutlet selOutEdgeSelectionInlet selInEdge SelectionNodeselNodeVCanvasvcLayoutvcStylevcGraphvcFramesvcSize vcMousePosvcToolvcActive vcSelected vcDragging ToolContext TCExprNode TCEditFrame TCCallFrame TCWorkspaceTooltoolName toolActivatedtoolOp CanvasToolOpToolOpToolbox toolboxFrame toolboxVBox VPToolkit toolkitName toolkitWidth toolkitRowsFunctionEditor fedWindow fedWinTitle fedFunction fedCanvas WorkspacewsBoxwsCanvas wsButtonBar wsStatusbarWinId VPUIWindowFunctionPadWindow VPUIWorkWinVPUI vpuiWindows vpuiToolkits vpuiFilePath vpuiStylevpuiInitialEnv vpuiGlobalEnv vpuiFileEnvvpuiFileChangedvpuiUserEnvAListvpuiInsertWindowvpuiTryGetWindow vpuiGetWindowvpuiReplaceWindowvpuiUpdateWindowvpuiUpdateWindowIOvpuiRemoveVPUIWindowvpuiWindowWindowvpuiWindowLookupCanvasvpuiWindowGetCanvasvpuiWindowSetCanvasvpuiWindowModCanvasvpuiWindowModCanvasIO vpuiModCanvasvpuiModCanvasIOfedFunctionName toToolOpVWMenuItemAction MenuItemSpecSubMenuMenuItemMenuSpecCBMgrCmdUMTestAfterButtonClickedOnEntryActivateOnMenuItemActivateLeafOnLayoutButtonReleaseOnLayoutButtonPressOnLayoutMouseMoveOnLayoutExposeOnWindowKeyPressOnWindowDestroyOnWindowConfigureCBMgrmkCBMgr createMenuBaraddMenu createMenucreateMenuItem modifyIORefIO vcanvasNewnodeContainerFrame vcGetFramevcUpdateFrameAndGraphvcClearSelectionpointSelectionconnect disconnectvcFrameAddFunctoidNodevcFrameAddNodevcFrameDeleteNodevcFrameDeleteTree vcAddFrame atLeastSizevcInvalidateFrameWithParentvcInvalidateBox frameChanged drawCanvas vcanvasNodeAtvcanvasNodeRect whichFrame editFunctionvcFrameSubframes vcEvalDialog vcClearFrame vcCloseFrame cfContext callFramesToolIdToolArg ToolLiteral ToolFunction ToolDeleteToolMoveToolIfToolDisconnect ToolConnect vpuiSetToolvpuiWindowSetToolwsPushStatusbarwsPopStatusbar makeMoveToolmakeDeleteTool checkModsmakeConnectToolmakeDisconnectToolmakeFixedArgTool makeIfTool makeCopyTool functionTool vpuiAddFrame vwAddFramefunctionToolsFromListsshowFunctionEntryshowLiteralEntry dumpFrame dumpGraph dumpWorkWin clearFrame closeFramevpuiNewworkspaceNewDefaultworkspaceNewEditingaddArgToolButtonsaddApplyCloseButtonsvpuiQuitforallWindowsIO removeWindowdefineFunctionopenNodebaseFunctionsRows showWindownewWindowTitled showWorkWinshowWorkspaceWindow showFedWinfedWindowTitleshowFunctionPadWindownewFunctionDialogsetWSCanvasCallbackskeyBindingsHelpText gdkCursorNewgdkWindowSetCursorcursorTypeNumberversionbindirlibdirdatadir libexecdir getBinDir getLibDir getDataDir getLibexecDirgetDataFileName prettyParensprettyBracketssopsopLeftsopRightexprPrecrpIdrpRoot rpContentrpFrame rpExpanderrpVBox rpCurrentRowrpCurrentRowFreeWidth rpMaxWidthrpHPad debugTracing rpanelAddRow createDialogrunDialogHelper addEntriestoDoubleexactOp1 inexactOp1 eitherOp1exactOp2 inexactOp2 eitherOp2testKtestZBindingEnvFrame hsExpToVpeNegatehsListItemsToVpsevalTreeWithLimitvalueToLiteralunbound stackSize evalWithLimitprimitiveFunctionsprim primIntDivMod primIntDiv primIntMod primFloatDivprimArgCountErrorprimNullprimHeadprimTailprimConsprimN2NprimN1NprimN2BprimN1B grossProfitbonus1bonus2maxfact sumFromZerobuggySumFromZeroeFib1fib1 eSumFromZerormuleRmuleGcdgcdeEvenpeOddpevenpoddp eRabbitBabies eRabbitAdults rabbitTotal rabbitAdults rabbitBabies buggyLength listLengthlistSumsumbody1sumbody2listSum'buggySumpathToModuleNamesrcLochsModule hsImportDecl hsFunBindhsIdenthsSymbolhsPVarhsVar hsOperatehsCallhsOp nameToHaskellasModuletest1test2prettyDSprettyEShsppprettyEprettyV testParsetestCallPrefix testCallInfix testFunBindtestExportModuletestEFpythonLibSiffletPathflattishatom prettyLoop displayList1 displayList2 displayTailschemeLibSiffletPathSignMinusinputprog1typeName escapedCharunsignedIntegeroptSign applySign XMLConsumer XMLProducerdefaultOptions symbolToXml exprToXml xmlToExpr valueToXml xmlToValue vpTypeToXml xmlToVpType functionToXml xmlToFunctionfunctionsToXmlfindNode paddedWidth paddedHeight treeLayout2 centerGNodetreeLayoutAddMargin edgeNotEqual edgeNotTosproutgrUpdateNodeLabel drawIolet drawInlets drawOutlets drawIolets drawCircle updateCanvaskeyPresseditFrameNodeseditFrameNodeAtcallFrameNodeAt alignHeader alignFooterbuildFooterTextenableDoubleBuffering vcUpdateFrame vcDeleteFramegraphRenderFunctoidPartsgraphRenderForestgraphRenderTreegraphStartRendergraphRenderNode selectionNodevcInvalidateSimpleNodegrTreeSubframeNodes evalFramevcCloseSubframes canvasEditing toolIdToTooldefaultContextDescriptionconnmakeFixedLiteralTool dummyTool showToolEntryentryActivatedaddEntryCompletions entryKeyPress dumpWidgetwidgetClassNamebaseGHC.ListinitGHC.BasereturnaddArgToolButtonaddApplyCloseButtons2 fedFuncFrame workspaceNewvpuiAllWindowKeysvpuiUpdateCallFramescanvasUpdateCallFrame KeyAction KeyActionHQKeyActionModIO KeyActionDG KeyActionST KeyBinding kbGtkKeyName kbAltKeyNamekbRequiredModifiers kbDescriptionkbAction initCBDefaultworkspaceWindowInit buildMainMenuupdateFunctionPadIOfunctionPadWinIdaddUserFunctionsmakeFunctionPadPanelmakeToolButtonRowsmakeNamedToolButtonmakeToolButtonaddFunctionPadToolButton menuFileQuit menuFileOpencheckForChangescontinueFileOpenshowDialogFileOpenloadFile bindFunction menuFileSavemenuFileSaveAssaveFile userFunctionsmaybeExportUserFunctionsmenuFileExportHaskellmenuFileExportPythonmenuFileExportSchemechooseOutputFilemaybeDefaultOptionsmaybeRunSchemeOptionsDialoghelpTextshowHelpDialogbugsTextbugReportAddressshowBugs aboutTextsiffletVersionStringshowAboutDialogeditFrameFunctioneditNewFunctionconfiguredCallbackhandleConfiguredexposedCallback handleExposedkeyBindingsMapkeyBindingsList vpuiKeyHelpkeyPressCallbackbuttonPressCallbackmouseMoveCallbackbuttonReleaseCallbackhandleButtonPressframeButtonPressedframeBodyButtonPressedleftButtonPressedInFrameFooterbeginFrameDraghandleMouseMove continueDragcontinueDragSimplecontinueDragFramehandleButtonReleaseofferContextMenucontextMenuOptions