]> gitweb.factorcode.org Git - factor.git/blob - core/destructors/destructors.factor
Merge commit 'mongo-factor-driver/master' into mongo-factor-driver
[factor.git] / core / destructors / destructors.factor
1 ! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors continuations kernel namespaces make
4 sequences vectors ;
5 IN: destructors
6
7 TUPLE: disposable disposed ;
8
9 GENERIC: dispose* ( disposable -- )
10
11 ERROR: already-disposed disposable ;
12
13 : check-disposed ( disposable -- )
14     dup disposed>> [ already-disposed ] [ drop ] if ; inline
15
16 GENERIC: dispose ( disposable -- )
17
18 M: object dispose
19     dup disposed>> [ drop ] [ t >>disposed dispose* ] if ;
20
21 : dispose-each ( seq -- )
22     [
23         [ [ dispose ] curry [ , ] recover ] each
24     ] { } make [ peek rethrow ] unless-empty ;
25
26 : with-disposal ( object quot -- )
27     over [ dispose ] curry [ ] cleanup ; inline
28
29 <PRIVATE
30
31 SYMBOL: always-destructors
32
33 SYMBOL: error-destructors
34
35 : do-always-destructors ( -- )
36     always-destructors get <reversed> dispose-each ;
37
38 : do-error-destructors ( -- )
39     error-destructors get <reversed> dispose-each ;
40
41 PRIVATE>
42
43 : &dispose ( disposable -- disposable )
44     dup always-destructors get push ; inline
45
46 : |dispose ( disposable -- disposable )
47     dup error-destructors get push ; inline
48
49 : with-destructors ( quot -- )
50     [
51         V{ } clone always-destructors set
52         V{ } clone error-destructors set
53         [ do-always-destructors ]
54         [ do-error-destructors ]
55         cleanup
56     ] with-scope ; inline