diff --git a/lib/chibi/iset/constructors.scm b/lib/chibi/iset/constructors.scm index ec72f3e6..6c09d553 100644 --- a/lib/chibi/iset/constructors.scm +++ b/lib/chibi/iset/constructors.scm @@ -171,10 +171,19 @@ (iset-node-extract node (+ end 1) (iset-end node))))) (define (iset-node-extract node start end) - (let ((bits (and (iset-bits node) - (arithmetic-shift (iset-bits node) - (- (iset-start node) start))))) - (%make-iset start end bits #f #f))) + (cond + ((iset-bits node) + => (lambda (node-bits) + (let* ((bits + (bitwise-and + (arithmetic-shift node-bits (- (iset-start node) start)) + (range->bits start end))) + (new-end (min end (+ start (integer-length bits))))) + (%make-iset start new-end bits #f #f)))) + (else + (%make-iset (max start (iset-start node)) + (min end (iset-end node)) + #f #f #f)))) (define (iset-adjoin! iset . ls) (list->iset! ls iset)) diff --git a/tests/iset-tests.scm b/tests/iset-tests.scm index e7b4b160..3fd18fac 100644 --- a/tests/iset-tests.scm +++ b/tests/iset-tests.scm @@ -102,5 +102,46 @@ (test-assert (iset= (iset-union (iset 1 3) (iset 3 4)) (iset 1 3 4))) (test-assert (iset= (iset-union (iset 3) (iset 1 3)) (iset 1 3))) +(test-assert (iset= (iset-union (iset 1 4) (iset 3 4 5)) (iset 1 3 4 5))) + +(test '(1 2 3 4 5 6 7 8) (iset->list (iset 1 2 3 4 5 6 7 8))) +(test '(1 3 4 5 6 7 8) (iset->list (iset 1 3 4 5 6 7 8))) +(test '(1 2 4 5 6 7 8) (iset->list (iset 1 2 4 5 6 7 8))) +(test '(1 2 3 5 6 7 8) (iset->list (iset 1 2 3 5 6 7 8))) +(test '(1 2 3 4 6 7 8) (iset->list (iset 1 2 3 4 6 7 8))) +(test '(1 2 3 4 5 7 8) (iset->list (iset 1 2 3 4 5 7 8))) +(test '(1 2 3 4 5 6 8) (iset->list (iset 1 2 3 4 5 6 8))) + +(test '(1 2 3 4 5 6 7 8) + (iset->list (iset-union (iset 1 2 3 4) (iset 5 6 7 8)))) +(test '(1 3 4 5 6 7 8) + (iset->list (iset-union (iset 1 3 4) (iset 5 6 7 8)))) +(test '(1 2 4 5 6 7 8) + (iset->list (iset-union (iset 1 2 4) (iset 5 6 7 8)))) +(test '(1 2 3 5 6 7 8) + (iset->list (iset-union (iset 1 2 3) (iset 5 6 7 8)))) +(test '(1 2 3 4 6 7 8) + (iset->list (iset-union (iset 1 2 3 4) (iset 6 7 8)))) +(test '(1 2 3 4 5 7 8) + (iset->list (iset-union (iset 1 2 3 4) (iset 5 7 8)))) +(test '(1 2 3 4 5 6 8) + (iset->list (iset-union (iset 1 2 3 4) (iset 5 6 8)))) +(test '(1 2 3 6 7 8) + (iset->list (iset-union (iset 1 2 3) (iset 6 7 8)))) +(test '(1 3 6 8) + (iset->list (iset-union (iset 1 3) (iset 6 8)))) + +(test '(1 2 3 4 1001 1002 1003 1004 2001 2002 2003 2004) + (iset->list (iset-union (iset 1 2 3 4 1001 1002) + (iset 1003 1004 2001 2002 2003 2004)))) +(test '(1 2 4 1001 1002 1003 1004 2001 2002 2003 2004) + (iset->list (iset-union (iset 1 2 4 1001 1002) + (iset 1003 1004 2001 2002 2003 2004)))) +(test '(1 2 3 4 1001 1002 1004 2001 2002 2003 2004) + (iset->list (iset-union (iset 1 2 3 4 1001 1002) + (iset 1004 2001 2002 2003 2004)))) +(test '(1 2 3 4 1001 1002 1003 1004 2001 2003 2004) + (iset->list (iset-union (iset 1 2 3 4 1001 1002) + (iset 1003 1004 2001 2003 2004)))) (test-end)