sequence-length: more O(1) special cases

This commit is contained in:
Gustavo Massaccesi 2016-01-04 21:12:15 -03:00
parent bfe9b4aefd
commit 9a6726b10d

View File

@ -2,6 +2,8 @@
(require "stream.rkt" (require "stream.rkt"
"private/sequence.rkt" "private/sequence.rkt"
"fixnum.rkt"
"flonum.rkt"
racket/contract/combinator racket/contract/combinator
racket/contract/base racket/contract/base
(for-syntax racket/base) (for-syntax racket/base)
@ -41,8 +43,13 @@
(define (sequence-length s) (define (sequence-length s)
(unless (sequence? s) (raise-argument-error 'sequence-length "sequence?" s)) (unless (sequence? s) (raise-argument-error 'sequence-length "sequence?" s))
(cond [(list? s) (length s)] (cond [(exact-nonnegative-integer? s) s]
[(list? s) (length s)]
[(vector? s) (vector-length s)] [(vector? s) (vector-length s)]
[(flvector? s) (flvector-length s)]
[(fxvector? s) (fxvector-length s)]
[(string? s) (string-length s)]
[(bytes? s) (bytes-length s)]
[(hash? s) (hash-count s)] [(hash? s) (hash-count s)]
[else [else
(for/fold ([c 0]) ([i (in-values*-sequence s)]) (for/fold ([c 0]) ([i (in-values*-sequence s)])