"maybe{"
"union{"
"intersection{"
+ "predicate{"
"initial:"
"read-only"
"call("
M: anonymous-union pprint-delims drop \ union{ \ } ;
M: anonymous-intersection pprint-delims drop \ intersection{ \ } ;
M: anonymous-complement pprint-delims drop \ not{ \ } ;
+M: anonymous-predicate pprint-delims drop \ predicate{ \ } ;
M: maybe pprint-delims drop \ maybe{ \ } ;
M: object >pprint-sequence ;
M: anonymous-union >pprint-sequence members>> ;
M: anonymous-intersection >pprint-sequence participants>> ;
M: anonymous-complement >pprint-sequence class>> 1array ;
+M: anonymous-predicate >pprint-sequence [ class>> ] [ predicate>> ] bi 2array ;
M: maybe >pprint-sequence class>> 1array ;
: class-slot-sequence ( class slots -- sequence )
M: anonymous-union pprint* pprint-object ;
M: anonymous-intersection pprint* pprint-object ;
M: anonymous-complement pprint* pprint-object ;
+M: anonymous-predicate pprint* pprint-object ;
M: maybe pprint* pprint-object ;
M: wrapper pprint*
M: anonymous-complement add-depends-on-class
class>> add-depends-on-class ;
+M: anonymous-predicate add-depends-on-class
+ class>> add-depends-on-class ;
+
GENERIC: add-depends-on-c-type ( c-type -- )
M: void add-depends-on-c-type drop ;
! Copyright (C) 2004, 2010 Slava Pestov.
! See https://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs classes classes.private
-combinators kernel make math math.order namespaces sequences
-sets sorting vectors ;
+combinators kernel make math math.order namespaces quotations
+sequences sets sorting vectors ;
IN: classes.algebra
DEFER: sort-classes
M: anonymous-complement class-name
class>> class-name ;
+
+TUPLE: anonymous-predicate
+ { class classoid read-only initial: object }
+ { predicate callable read-only initial: [ drop f ] } ;
+
+INSTANCE: anonymous-predicate classoid
+
+: <anonymous-predicate> ( object -- classoid )
+ first2 [ classoid check-instance ] [ quotation check-instance ] bi*
+ anonymous-predicate boa ;
+
+! Used for ordering classes
+M: anonymous-predicate rank-class drop 1.5 ;
+
DEFER: (class<=)
DEFER: (class-not)
M: anonymous-complement (classes-intersect?)
class>> class<= not ;
+M: anonymous-predicate (classes-intersect?)
+ class>> classes-intersect? ;
+
: anonymous-union-and ( first second -- class )
members>> [ class-and ] with map <anonymous-union> ;
M: anonymous-union (flatten-class)
members>> [ (flatten-class) ] each ;
+M: anonymous-predicate (flatten-class)
+ class>> (flatten-class) ;
+
PRIVATE>
ERROR: topological-sort-failed ;
! Copyright (C) 2004, 2010 Slava Pestov.
! See https://factorcode.org/license.txt for BSD license.
-USING: classes classes.algebra classes.algebra.private
-classes.private kernel words ;
+USING: accessors classes classes.algebra
+classes.algebra.private classes.private kernel words ;
IN: classes.predicate
PREDICATE: predicate-class < class
M: predicate-class (classes-intersect?)
superclass-of classes-intersect? ;
+
+M: anonymous-predicate predicate-def
+ '[ _ 2dup instance?
+ [ predicate>> call( obj -- ? ) ] [ 2drop f ] if ] ;
+
+M: anonymous-predicate instance?
+ 2dup class>> instance?
+ [ predicate>> call( object -- ? ) ] [ 2drop f ] if ;
+
+M: anonymous-predicate class-name
+ class>> class-name ;
+
+M: anonymous-predicate normalize-class
+ class>> normalize-class ;
+
M: anonymous-intersection implementor-classes participants>> ;
+M: anonymous-predicate implementor-classes class>> 1array ;
+
: with-implementors ( class generic quot -- )
[ swap implementor-classes [ implementors-map get at ] map ] dip call ; inline
\ } [ <anonymous-union> <anonymous-complement> ] parse-literal
] define-core-syntax
+ "predicate{" [
+ \ } [ <anonymous-predicate> ] parse-literal
+ ] define-core-syntax
+
"intersection{" [
\ } [ <anonymous-intersection> ] parse-literal
] define-core-syntax