]> gitweb.factorcode.org Git - factor.git/commitdiff
Adding and removing vocabs now updates all-vocabs-seq
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 1 May 2009 12:21:56 +0000 (07:21 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 1 May 2009 12:21:56 +0000 (07:21 -0500)
basis/tools/vocabs/vocabs.factor
core/vocabs/vocabs.factor

index ba99a41eba02eacc79643a82f15ab95c8a881fbd..4b9a72a4439c7627104fe668d3a7f0850706c6da 100644 (file)
@@ -74,8 +74,6 @@ SYMBOL: failures
 \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
@@ -287,3 +285,12 @@ MEMO: all-authors ( -- seq )
     \ 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
index 2b978e866625c101e51be13c2122119d6d1dd26f..73ffd1a80c24f9f44bd8e3744327362d61203564 100644 (file)
@@ -1,7 +1,7 @@
 ! 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
@@ -65,8 +65,24 @@ M: object vocab-main vocab vocab-main ;
 
 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 ;
 
@@ -99,7 +115,8 @@ M: string >vocab-link dup vocab [ ] [ <vocab-link> ] ?if ;
 
 : 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 ;