]> gitweb.factorcode.org Git - factor.git/blob - basis/furnace/scopes/scopes.factor
use ``if*`` instead of ``dup [ ] [ drop ] if``.
[factor.git] / basis / furnace / scopes / scopes.factor
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 FROM: assocs => change-at ;
6 IN: furnace.scopes
7
8 TUPLE: scope < server-state namespace changed? ;
9
10 : empty-scope ( class -- scope )
11     f swap new-server-state
12         H{ } clone >>namespace ; inline
13
14 scope f
15 {
16     { "namespace" "NAMESPACE" FACTOR-BLOB +not-null+ }
17 } define-persistent
18
19 : scope-changed ( scope -- )
20     t >>changed? drop ;
21
22 : scope-get ( key scope -- value )
23     [ namespace>> at ] [ drop f ] if* ;
24
25 : scope-set ( value key scope -- )
26     [ namespace>> set-at ] [ scope-changed ] bi ;
27
28 : scope-change ( key quot scope -- )
29     [ namespace>> swap change-at ] [ scope-changed ] bi ; inline
30
31 ! Destructor
32 TUPLE: scope-saver scope manager ;
33
34 C: <scope-saver> scope-saver
35
36 M: scope-saver dispose
37     [ manager>> ] [ scope>> ] bi
38     dup changed?>> [
39         [ swap touch-state ] [ update-tuple ] bi
40     ] [ 2drop ] if ;
41
42 : save-scope-after ( scope manager -- )
43     <scope-saver> &dispose drop ;