1 ! Copyright (C) 2008 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel namespaces sequences vectors assocs accessors ;
6 TUPLE: table rows columns start-state final-states ;
7 TUPLE: entry row-key column-key value ;
9 GENERIC: add-entry ( entry table -- )
11 : make-table ( class -- obj )
15 H{ } clone >>final-states ;
22 : (add-row) ( row-key table -- row )
26 drop H{ } clone [ -rot rows>> set-at ] keep
29 : add-row ( row-key table -- )
32 : add-column ( column-key table -- )
33 t -rot columns>> set-at ;
35 : set-row ( row row-key table -- )
38 : lookup-row ( row-key table -- row/f ? )
41 : row-exists? ( row-key table -- ? )
44 : lookup-column ( column-key table -- column/f ? )
47 : column-exists? ( column-key table -- ? )
51 ERROR: no-column key ;
53 : get-row ( row-key table -- row )
60 : get-column ( column-key table -- column )
67 : get-entry ( row-key column-key table -- obj ? )
74 : (set-entry) ( entry table -- value column-key row )
75 [ >r column-key>> r> add-column ] 2keep
76 dupd >r row-key>> r> (add-row)
77 >r [ value>> ] keep column-key>> r> ;
79 : set-entry ( entry table -- )
82 : delete-entry ( entry table -- )
83 >r [ column-key>> ] [ row-key>> ] bi r>
84 lookup-row [ delete-at ] [ 2drop ] if ;
86 : swap-rows ( row-key1 row-key2 table -- )
87 [ tuck get-row >r get-row r> ] 3keep
88 >r >r rot r> r> [ set-row ] keep set-row ;
90 : member?* ( obj obj -- bool )
91 2dup = [ 2drop t ] [ member? ] if ;
93 : find-by-column ( column-key data table -- seq )
94 swapd 2dup lookup-column 2drop
98 >r pick r> member?* [ , ] [ drop ] if
106 TUPLE: vector-table < table ;
107 : <vector-table> ( -- obj )
108 vector-table make-table ;
110 : add-hash-vector ( value key hash -- )
115 V{ } clone [ push ] keep
116 -rot >r >r [ push ] keep r> r> set-at
122 M: vector-table add-entry ( entry table -- )
123 (set-entry) add-hash-vector ;