: check-disposed ( disposable -- disposable )
dup disposed>> [ already-disposed ] when ; inline
-GENERIC: dispose ( disposable -- )
+: if-disposed ( ..a disposable quot1: ( ..a -- ..b ) quot2: ( ..a disposable -- ..b ) -- ..b )
+ [ dup disposed>> ] [ [ drop ] prepose ] [ ] tri* if ; inline
+
+: when-disposed ( ..a disposable quot1: ( ..a -- ..b ) quot2: ( ..a disposable -- ..b ) -- ..b )
+ [ ] if-disposed ; inline
-: unless-disposed ( disposable quot -- )
- [ dup disposed>> [ drop ] ] dip if ; inline
+: unless-disposed ( ... disposable quot: ( ... disposable -- ... ) -- ... )
+ [ ] swap if-disposed ; inline
+
+GENERIC: dispose ( disposable -- )
M: object dispose [ t >>disposed dispose* ] unless-disposed ;