Making propagation and tuple.parser refer to new-sets; adding some missing features from sets into new-sets
							parent
							
								
									e43312d780
								
							
						
					
					
						commit
						b76c82048d
					
				| 
						 | 
				
			
			@ -8,7 +8,7 @@ layouts compiler.tree.propagation.info compiler.tree.def-use
 | 
			
		|||
compiler.tree.debugger compiler.tree.checker slots.private words
 | 
			
		||||
hashtables classes assocs locals specialized-arrays system
 | 
			
		||||
sorting math.libm math.floats.private math.integers.private
 | 
			
		||||
math.intervals quotations effects alien alien.data sets ;
 | 
			
		||||
math.intervals quotations effects alien alien.data new-sets ;
 | 
			
		||||
FROM: math => float ;
 | 
			
		||||
SPECIALIZED-ARRAY: double
 | 
			
		||||
SPECIALIZED-ARRAY: void*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,12 +3,13 @@
 | 
			
		|||
USING: alien.c-types kernel sequences words fry generic accessors
 | 
			
		||||
classes.tuple classes classes.algebra definitions
 | 
			
		||||
stack-checker.dependencies quotations classes.tuple.private math
 | 
			
		||||
math.partial-dispatch math.private math.intervals sets.private
 | 
			
		||||
math.partial-dispatch math.private math.intervals new-sets.private
 | 
			
		||||
math.floats.private math.integers.private layouts math.order
 | 
			
		||||
vectors hashtables combinators effects generalizations assocs
 | 
			
		||||
sets combinators.short-circuit sequences.private locals growable
 | 
			
		||||
new-sets combinators.short-circuit sequences.private locals growable
 | 
			
		||||
stack-checker namespaces compiler.tree.propagation.info ;
 | 
			
		||||
FROM: math => float ;
 | 
			
		||||
FROM: new-sets => set ;
 | 
			
		||||
IN: compiler.tree.propagation.transforms
 | 
			
		||||
 | 
			
		||||
\ equal? [
 | 
			
		||||
| 
						 | 
				
			
			@ -207,7 +208,7 @@ ERROR: bad-partial-eval quot word ;
 | 
			
		|||
        [ drop f ] swap
 | 
			
		||||
        [ literalize [ t ] ] { } map>assoc linear-case-quot
 | 
			
		||||
    ] [
 | 
			
		||||
        unique [ key? ] curry
 | 
			
		||||
        tester
 | 
			
		||||
    ] if ;
 | 
			
		||||
 | 
			
		||||
\ member? [
 | 
			
		||||
| 
						 | 
				
			
			@ -272,14 +273,14 @@ CONSTANT: lookup-table-at-max 256
 | 
			
		|||
\ at* [ at-quot ] 1 define-partial-eval
 | 
			
		||||
 | 
			
		||||
: diff-quot ( seq -- quot: ( seq' -- seq'' ) )
 | 
			
		||||
    tester '[ [ @ not ] filter ] ;
 | 
			
		||||
    tester '[ [ [ @ not ] filter ] keep set-like ] ;
 | 
			
		||||
 | 
			
		||||
\ diff [ diff-quot ] 1 define-partial-eval
 | 
			
		||||
M\ set diff [ diff-quot ] 1 define-partial-eval
 | 
			
		||||
 | 
			
		||||
: intersect-quot ( seq -- quot: ( seq' -- seq'' ) )
 | 
			
		||||
    tester '[ _ filter ] ;
 | 
			
		||||
    tester '[ [ _ filter ] keep set-like ] ;
 | 
			
		||||
 | 
			
		||||
\ intersect [ intersect-quot ] 1 define-partial-eval
 | 
			
		||||
M\ set intersect [ intersect-quot ] 1 define-partial-eval
 | 
			
		||||
 | 
			
		||||
: fixnum-bits ( -- n )
 | 
			
		||||
    cell-bits tag-bits get - ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
! Copyright (C) 2008, 2010 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors kernel sets namespaces make sequences parser
 | 
			
		||||
USING: accessors kernel new-sets namespaces make sequences parser
 | 
			
		||||
lexer combinators words classes.parser classes.tuple arrays
 | 
			
		||||
slots math assocs parser.notes classes classes.algebra ;
 | 
			
		||||
IN: classes.tuple.parser
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,3 +22,6 @@ M: hash-set clone
 | 
			
		|||
    table>> clone hash-set boa ;
 | 
			
		||||
 | 
			
		||||
M: sequence fast-set <hash-set> ;
 | 
			
		||||
 | 
			
		||||
M: sequence duplicates
 | 
			
		||||
    HS{ } clone [ [ in? ] [ adjoin ] 2bi ] curry filter ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,3 +40,12 @@ IN: new-sets.tests
 | 
			
		|||
[ HS{ 1 2 3 } ] [ { 1 2 3 } fast-set ] unit-test
 | 
			
		||||
 | 
			
		||||
[ { 1 2 3 } ] [ { { 1 } { 2 } { 1 3 } } combine ] unit-test
 | 
			
		||||
 | 
			
		||||
[ f ] [ { 0 1 1 2 3 5 } all-unique? ] unit-test
 | 
			
		||||
[ t ] [ { 0 1 2 3 4 5 } all-unique? ] unit-test
 | 
			
		||||
 | 
			
		||||
[ { 1 2 3 } ] [ { 1 2 2 3 3 } { } set-like ] unit-test
 | 
			
		||||
[ { 3 2 1 } ] [ { 3 3 2 2 1 } { } set-like ] unit-test
 | 
			
		||||
 | 
			
		||||
[ { 1 2 1 } ] [ { 1 2 3 2 1 2 1 } duplicates ] unit-test
 | 
			
		||||
[ f ] [ HS{ 1 2 3 1 2 1 } duplicates ] unit-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,8 @@
 | 
			
		|||
! Copyright (C) 2010 Daniel Ehrenberg
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors assocs hashtables kernel
 | 
			
		||||
USING: accessors assocs hashtables kernel vectors
 | 
			
		||||
math sequences ;
 | 
			
		||||
FROM: sets => prune ;
 | 
			
		||||
IN: new-sets
 | 
			
		||||
! The vocab is called new-sets for now, but only until it gets into core
 | 
			
		||||
! All the code here is in the style that could be put in core
 | 
			
		||||
 | 
			
		||||
! Set protocol
 | 
			
		||||
MIXIN: set
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +18,8 @@ GENERIC: intersects? ( set1 set2 -- ? )
 | 
			
		|||
GENERIC: diff ( set1 set2 -- set )
 | 
			
		||||
GENERIC: subset? ( set1 set2 -- ? )
 | 
			
		||||
GENERIC: set= ( set1 set2 -- ? )
 | 
			
		||||
GENERIC: duplicates ( set -- sequence )
 | 
			
		||||
GENERIC: all-unique? ( set -- ? )
 | 
			
		||||
 | 
			
		||||
! Defaults for some methods.
 | 
			
		||||
! Override them for efficiency
 | 
			
		||||
| 
						 | 
				
			
			@ -30,8 +29,11 @@ M: set union
 | 
			
		|||
 | 
			
		||||
<PRIVATE
 | 
			
		||||
 | 
			
		||||
: tester ( set -- quot )
 | 
			
		||||
    fast-set [ in? ] curry ; inline
 | 
			
		||||
 | 
			
		||||
: sequence/tester ( set1 set2 -- set1' quot )
 | 
			
		||||
    [ members ] [ fast-set [ in? ] curry ] bi* ; inline
 | 
			
		||||
    [ members ] [ tester ] bi* ; inline
 | 
			
		||||
 | 
			
		||||
PRIVATE>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -52,15 +54,45 @@ M: set set=
 | 
			
		|||
 | 
			
		||||
M: set fast-set ;
 | 
			
		||||
 | 
			
		||||
M: set duplicates drop f ;
 | 
			
		||||
 | 
			
		||||
M: set all-unique? drop t ;
 | 
			
		||||
 | 
			
		||||
<PRIVATE
 | 
			
		||||
 | 
			
		||||
: (prune) ( elt hash vec -- )
 | 
			
		||||
    3dup drop key? [ 3drop ] [
 | 
			
		||||
        [ drop dupd set-at ] [ nip push ] 3bi
 | 
			
		||||
    ] if ; inline
 | 
			
		||||
 | 
			
		||||
: prune ( seq -- newseq )
 | 
			
		||||
    [ ] [ length <hashtable> ] [ length <vector> ] tri
 | 
			
		||||
    [ [ (prune) ] 2curry each ] keep ;
 | 
			
		||||
 | 
			
		||||
PRIVATE>
 | 
			
		||||
 | 
			
		||||
! Sequences are sets
 | 
			
		||||
INSTANCE: sequence set
 | 
			
		||||
M: sequence in? member? ; inline
 | 
			
		||||
M: sequence adjoin [ delete ] [ push ] 2bi ;
 | 
			
		||||
M: sequence delete remove! drop ; inline
 | 
			
		||||
M: sequence set-like
 | 
			
		||||
    [ dup sequence? [ prune ] [ members ] if ] dip like ;
 | 
			
		||||
M: sequence members fast-set members ;
 | 
			
		||||
 | 
			
		||||
M: sequence in?
 | 
			
		||||
    member? ; inline
 | 
			
		||||
 | 
			
		||||
M: sequence adjoin
 | 
			
		||||
    [ delete ] [ push ] 2bi ;
 | 
			
		||||
 | 
			
		||||
M: sequence delete
 | 
			
		||||
    remove! drop ; inline
 | 
			
		||||
 | 
			
		||||
M: sequence set-like
 | 
			
		||||
    [ members ] dip like ;
 | 
			
		||||
 | 
			
		||||
M: sequence members
 | 
			
		||||
    [ prune ] keep like ;
 | 
			
		||||
 | 
			
		||||
M: sequence all-unique?
 | 
			
		||||
    dup prune sequence= ;
 | 
			
		||||
 | 
			
		||||
! Some sequence methods are defined using hash-sets
 | 
			
		||||
USE: vocabs.loader
 | 
			
		||||
"hash-sets" require
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue