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