factor/basis/furnace/scopes/scopes.factor

44 lines
1.1 KiB
Factor

! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel accessors assocs destructors
db.tuples db.types furnace.cache ;
FROM: assocs => change-at ;
IN: furnace.scopes
TUPLE: scope < server-state namespace changed? ;
: empty-scope ( class -- scope )
f swap new-server-state
H{ } clone >>namespace ; inline
scope f
{
{ "namespace" "NAMESPACE" FACTOR-BLOB +not-null+ }
} define-persistent
: scope-changed ( scope -- )
t >>changed? drop ;
: scope-get ( key scope -- value )
dup [ namespace>> at ] [ 2drop f ] if ;
: scope-set ( value key scope -- )
[ namespace>> set-at ] [ scope-changed ] bi ;
: scope-change ( key quot scope -- )
[ namespace>> swap change-at ] [ scope-changed ] bi ; inline
! Destructor
TUPLE: scope-saver scope manager ;
C: <scope-saver> scope-saver
M: scope-saver dispose
[ manager>> ] [ scope>> ] bi
dup changed?>> [
[ swap touch-state ] [ update-tuple ] bi
] [ 2drop ] if ;
: save-scope-after ( scope manager -- )
<scope-saver> &dispose drop ;