Clean up some duplication
[factor/jcg.git] / basis / furnace / scopes / scopes.factor
blobdaad0dcf915df55a1dcaec13afeb87f41a4810b1
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors assocs destructors
4 db.tuples db.types furnace.cache ;
5 IN: furnace.scopes
7 TUPLE: scope < server-state namespace changed? ;
9 : empty-scope ( class -- scope )
10     f swap new-server-state
11         H{ } clone >>namespace ; inline
13 scope f
15     { "namespace" "NAMESPACE" FACTOR-BLOB +not-null+ }
16 } define-persistent
18 : scope-changed ( scope -- )
19     t >>changed? drop ;
21 : scope-get ( key scope -- value )
22     dup [ namespace>> at ] [ 2drop f ] if ;
24 : scope-set ( value key scope -- )
25     [ namespace>> set-at ] [ scope-changed ] bi ;
27 : scope-change ( key quot scope -- )
28     [ namespace>> swap change-at ] [ scope-changed ] bi ; inline
30 ! Destructor
31 TUPLE: scope-saver scope manager ;
33 C: <scope-saver> scope-saver
35 M: scope-saver dispose
36     [ manager>> ] [ scope>> ] bi
37     dup changed?>> [
38         [ swap touch-state ] [ update-tuple ] bi
39     ] [ 2drop ] if ;
41 : save-scope-after ( scope manager -- )
42     <scope-saver> &dispose drop ;