change-tracking-tuple class. subclasses will have a "changed?" slot that gets set to true when any slot is modified

db4
Joe Groff 2009-07-31 21:48:17 -05:00
parent 918b95dfc7
commit 06eeedcb4c
7 changed files with 74 additions and 9 deletions

View File

@ -35,6 +35,7 @@ $nl
"You can ask a class for its superclass:" "You can ask a class for its superclass:"
{ $subsection superclass } { $subsection superclass }
{ $subsection superclasses } { $subsection superclasses }
{ $subsection subclass-of? }
"Class predicates can be used to test instances directly:" "Class predicates can be used to test instances directly:"
{ $subsection "class-predicates" } { $subsection "class-predicates" }
"There is a universal class which all objects are an instance of, and an empty class with no instances:" "There is a universal class which all objects are an instance of, and an empty class with no instances:"
@ -102,7 +103,21 @@ HELP: superclasses
} }
} ; } ;
{ superclass superclasses } related-words HELP: subclass-of?
{ $values
{ "class" class }
{ "superclass" class }
{ "?" boolean }
}
{ $description "Outputs a boolean value indicating whether " { $snippet "class" } " is at any level a subclass of " { $snippet "superclass" } "." }
{ $examples
{ $example "USING: classes classes.tuple prettyprint words ;"
"tuple-class \\ class subclass-of? ."
"t"
}
} ;
{ superclass superclasses subclass-of? } related-words
HELP: members HELP: members
{ $values { "class" class } { "seq" "a sequence of union members, or " { $link f } } } { $values { "class" class } { "seq" "a sequence of union members, or " { $link f } } }

View File

@ -59,6 +59,9 @@ M: predicate reset-word
: superclasses ( class -- supers ) : superclasses ( class -- supers )
[ superclass ] follow reverse ; [ superclass ] follow reverse ;
: subclass-of? ( class superclass -- ? )
swap superclasses member? ;
: members ( class -- seq ) : members ( class -- seq )
#! Output f for non-classes to work with algebra code #! Output f for non-classes to work with algebra code
dup class? [ "members" word-prop ] [ drop f ] if ; dup class? [ "members" word-prop ] [ drop f ] if ;

View File

@ -26,8 +26,10 @@ PREDICATE: writer-method < method-body "writing" word-prop ;
[ drop define ] [ drop define ]
3bi ; 3bi ;
: reader-quot ( slot-spec -- quot ) GENERIC# reader-quot 1 ( class slot-spec -- quot )
[
M: object reader-quot
nip [
dup offset>> , dup offset>> ,
\ slot , \ slot ,
dup class>> object bootstrap-word eq? dup class>> object bootstrap-word eq?
@ -51,8 +53,12 @@ PREDICATE: writer-method < method-body "writing" word-prop ;
: define-reader ( class slot-spec -- ) : define-reader ( class slot-spec -- )
[ nip name>> define-reader-generic ] [ nip name>> define-reader-generic ]
[ [
[ name>> reader-word ] [ reader-quot ] [ reader-props ] tri {
define-typecheck [ drop ]
[ nip name>> reader-word ]
[ reader-quot ]
[ nip reader-props ]
} 2cleave define-typecheck
] 2bi ; ] 2bi ;
: writer-word ( name -- word ) : writer-word ( name -- word )
@ -83,8 +89,10 @@ ERROR: bad-slot-value value class ;
: writer-quot/fixnum ( slot-spec -- ) : writer-quot/fixnum ( slot-spec -- )
[ [ >fixnum ] dip ] % writer-quot/check ; [ [ >fixnum ] dip ] % writer-quot/check ;
: writer-quot ( slot-spec -- quot ) GENERIC# writer-quot 1 ( class slot-spec -- quot )
[
M: object writer-quot
nip [
{ {
{ [ dup class>> object bootstrap-word eq? ] [ writer-quot/object ] } { [ dup class>> object bootstrap-word eq? ] [ writer-quot/object ] }
{ [ dup class>> "coercer" word-prop ] [ writer-quot/coerce ] } { [ dup class>> "coercer" word-prop ] [ writer-quot/coerce ] }
@ -101,8 +109,12 @@ ERROR: bad-slot-value value class ;
: define-writer ( class slot-spec -- ) : define-writer ( class slot-spec -- )
[ nip name>> define-writer-generic ] [ [ nip name>> define-writer-generic ] [
[ name>> writer-word ] [ writer-quot ] [ writer-props ] tri {
define-typecheck [ drop ]
[ nip name>> writer-word ]
[ writer-quot ]
[ nip writer-props ]
} 2cleave define-typecheck
] 2bi ; ] 2bi ;
: setter-word ( name -- word ) : setter-word ( name -- word )

View File

@ -0,0 +1 @@
Joe Groff

View File

@ -0,0 +1,10 @@
USING: classes.tuple.change-tracking tools.test ;
IN: classes.tuple.change-tracking.tests
TUPLE: resource < change-tracking-tuple
{ pathname string } ;
: <resource> ( pathname -- resource ) f swap resource boa ;
[ t ] [ "foo" <resource> "bar" >>pathname changed?>> ] unit-test
[ f ] [ "foo" <resource> [ 123 >>pathname ] [ drop ] recover changed?>> ] unit-test

View File

@ -0,0 +1,23 @@
! (c)2009 Joe Groff bsd license
USING: accessors classes classes.tuple fry kernel sequences slots ;
IN: classes.tuple.change-tracking
TUPLE: change-tracking-tuple
{ changed? boolean } ;
PREDICATE: change-tracking-tuple-class < tuple-class
change-tracking-tuple subclass-of? ;
: changed? ( tuple -- changed? ) changed?>> ; inline
: clear-changed ( tuple -- tuple ) f >>changed? ; inline
: filter-changed ( sequence -- sequence' ) [ changed? ] filter ; inline
<PRIVATE
M: change-tracking-tuple-class writer-quot ( class slot-spec -- )
[ call-next-method ]
[ name>> "changed?" = [ '[ _ [ t >>changed? drop ] bi ] ] unless ] bi ;
PRIVATE>

View File

@ -0,0 +1 @@
Tuple classes that keep track of when they've been modified