diff --git a/core/classes/maybe/maybe.factor b/core/classes/maybe/maybe.factor index 1c1d24a102..9c89e368f7 100644 --- a/core/classes/maybe/maybe.factor +++ b/core/classes/maybe/maybe.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2011 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors classes classes.algebra +USING: accessors arrays classes classes.algebra classes.algebra.private classes.private classes.union.private kernel words ; IN: classes.maybe @@ -41,3 +41,6 @@ M: maybe class-name M: maybe predicate-def class>> predicate-def [ [ t ] if* ] curry ; + +M: maybe classes-contained-by + class>> 1array ; diff --git a/core/classes/union/union.factor b/core/classes/union/union.factor index c2e6af41ff..a9c833f285 100644 --- a/core/classes/union/union.factor +++ b/core/classes/union/union.factor @@ -56,12 +56,17 @@ M: union-class update-class define-union-predicate ; ERROR: cannot-reference-self class members ; -: union-members ( union -- members ) +GENERIC: classes-contained-by ( obj -- members ) + +M: union-class classes-contained-by ( union -- members ) + "members" word-prop [ f ] when-empty ; + +M: object classes-contained-by "members" word-prop [ f ] when-empty ; : check-self-reference ( class members -- class members ) 2dup [ - dup dup [ union-members ] map concat sift append + dup dup [ classes-contained-by ] map concat sift append 2dup set= [ 2drop f ] [ nip ] if ] follow concat member-eq? [ cannot-reference-self ] when ;