chibi-scheme/lib/chibi/iset.sld
Alex Shinn 8b5eb68238 File descriptors maintain a reference count of ports open on them
They can be close()d explicitly with close-file-descriptor, and
will close() on gc, but only explicitly closing the last port on
them will close the fileno.  Notably needed for network sockets
where we open separate input and output ports on the same socket.
2014-02-20 22:32:50 +09:00

77 lines
2.9 KiB
Scheme

;; base.scm - base integer set operations
;; Copyright (c) 2004-2012 Alex Shinn. All rights reserved.
;; BSD-style license: http://synthcode.com/license.txt
;; An integer set (iset) is a set of exact integers optimized for
;; minimal space usage and fast membership lookup. General set
;; operations are provided based on the character set operations found
;; in SRFI-14.
;;
;; Creating isets:
;;
;; (make-iset) ; an empty integer set
;; (make-iset n) ; a set of the single integer N
;; (make-iset n m) ; a set of the range of all integers from N-M inclusive
;;
;; The following procedures are provided as direct analogs of the
;; SRFI-14 procedures, accepting and returning isets and integers in
;; place of char-sets and characters:
;;
;; Creating isets:
;;
;; (iset-copy is) ; a new copy of IS
;; (iset n ...) ; an iset containing the elements N...
;; (list->iset ls [base-is]) ; an iset containing all the integers in
;; ; list LS, union BASE-IS if provided
;; (list->iset! ls base-is) ; same as above, allowed but not required to
;; ; modify base-is
;;
;; Querying isets:
;;
;; (iset-size is) ; return the # of elements in IS
;; (iset-contains? is n) ; test N for membership in IS
;; (iset->list is) ; returns a list of all integers in IS
;;
;; Predicates:
;;
;; (iset? obj) ; #t iff obj is an integer set
;; (iset= is ...) ; #t iff all arguments are equivalent integer sets
;; (iset<= is ...) ; #t iff the arguments are monotonically increasing sets
;; (iset>= is ...) ; #t iff the arguments are monotonically decreasing sets
;;
;; Cursors:
;;
;; (iset-cursor iset)
;; (iset-ref iset cursor)
;; (iset-cursor-next iset cursor)
;; (end-of-iset? iset)
;;
;; Set operations:
;;
;; (iset-adjoin is n ...) ; char-set-adjoin
;; (iset-delete is n ...) ; char-set-delete
;;
;; (iset-adjoin! is n ...) ; char-set-adjoin!
;; (iset-delete! is n ...) ; char-set-delete!
;;
;; (iset-union is1 ...) ; char-set-union
;; (iset-intersection is1 ...) ; char-set-intersection
;; (iset-difference is1 is2 ...) ; char-set-difference
;;
;; (iset-union! is1 ...) ; char-set-union!
;; (iset-intersection! is1 ...) ; char-set-intersection!
;; (iset-difference! is1 is2 ...) ; char-set-difference!
(define-library (chibi iset)
(import (chibi iset base)
(chibi iset iterators)
(chibi iset constructors))
(export
%make-iset make-iset iset? iset-contains? Integer-Set
iset iset-copy list->iset list->iset! iset-map
iset-adjoin iset-adjoin! iset-delete iset-delete!
iset-union iset-union! iset-intersection iset-intersection!
iset-difference iset-difference!
iset-empty? iset-fold iset-fold-node iset-for-each iset-for-each-node
iset-map iset->list iset-size iset= iset<= iset>=
iset-cursor iset-cursor? iset-cursor-next iset-ref end-of-iset?))