\r
SYMBOL: changed-vocabs\r
\r
-[ f changed-vocabs set-global ] "tools.vocabs" add-init-hook\r
-\r
: changed-vocab ( vocab -- )\r
dup vocab changed-vocabs get and\r
[ dup changed-vocabs get set-at ] [ drop ] if ;\r
\ all-vocabs-seq reset-memoized\r
\ all-authors reset-memoized\r
\ all-tags reset-memoized ;\r
+\r
+SINGLETON: cache-observer\r
+\r
+M: cache-observer vocabs-changed drop reset-cache ;\r
+\r
+[\r
+ f changed-vocabs set-global\r
+ cache-observer add-vocab-observer\r
+] "tools.vocabs" add-init-hook
\ No newline at end of file
! Copyright (C) 2007, 2009 Eduardo Cavazos, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs strings kernel sorting namespaces
-sequences definitions ;
+sequences definitions init ;
IN: vocabs
SYMBOL: dictionary
M: f vocab-main ;
+SYMBOL: vocab-observers
+
+GENERIC: vocabs-changed ( obj -- )
+
+[ V{ } clone vocab-observers set-global ] "vocabs" add-init-hook
+
+: add-vocab-observer ( obj -- )
+ vocab-observers get push ;
+
+: remove-vocab-observer ( obj -- )
+ vocab-observers get delq ;
+
+: notify-vocab-observers ( -- )
+ vocab-observers get [ vocabs-changed ] each ;
+
: create-vocab ( name -- vocab )
- dictionary get [ <vocab> ] cache ;
+ dictionary get [ <vocab> ] cache
+ notify-vocab-observers ;
ERROR: no-vocab name ;
: forget-vocab ( vocab -- )
dup words forget-all
- vocab-name dictionary get delete-at ;
+ vocab-name dictionary get delete-at
+ notify-vocab-observers ;
M: vocab-spec forget* forget-vocab ;