1 ! Copyright (C) 2006, 2007 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: assocs kernel namespaces sequences sets ;
8 : if-graph ( vertex edges graph quot -- )
9 dupd [ 3drop ] if ; inline
11 : nest ( key graph -- hash )
12 [ drop H{ } clone ] cache ; inline
16 : add-vertex ( vertex edges graph -- )
17 [ [ nest dupd set-at ] curry with each ] if-graph ; inline
19 : add-vertex* ( vertex edges graph -- )
21 swapd [ [ rot ] dip nest set-at ] 2curry assoc-each
24 : remove-vertex ( vertex edges graph -- )
25 [ [ at delete-at ] curry with each ] if-graph ; inline
27 : remove-vertex* ( vertex edges graph -- )
29 swapd [ [ rot ] dip at delete-at drop ] 2curry assoc-each
34 : (closure) ( obj assoc quot: ( elt -- assoc ) -- )
38 2over conjoin [ dip ] keep
39 [ [ drop ] 3dip (closure) ] 2curry assoc-each
40 ] if ; inline recursive
44 : closure ( obj quot -- assoc )
45 H{ } clone [ swap (closure) ] keep ; inline