You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
1.1 KiB
Racket
31 lines
1.1 KiB
Racket
9 years ago
|
#lang racket/base
|
||
|
(require "../define.rkt" racket/set racket/sequence)
|
||
|
|
||
|
(define+provide+safe (len x)
|
||
|
((or/c list? vector? set? sequence? string? symbol? path? hash?) . -> . integer?)
|
||
|
(cond
|
||
|
[(list? x) (length x)]
|
||
|
[(string? x) (string-length x)]
|
||
|
[(symbol? x) (len (symbol->string x))]
|
||
|
[(path? x) (len (path->string x))]
|
||
|
[(vector? x) (vector-length x)]
|
||
|
[(hash? x) (len (hash-keys x))]
|
||
|
[(set? x) (len (set->list x))]
|
||
|
[(and (sequence? x) (not (integer? x))) (len (sequence->list x))]
|
||
|
[else (error "len: can't calculate length of" x)]))
|
||
|
|
||
|
|
||
|
(module+ test
|
||
|
(require rackunit)
|
||
|
(check-equal? (len '(1 2 3)) 3)
|
||
|
(check-not-equal? (len '(1 2)) 3) ; len 2
|
||
|
(check-equal? (len "foo") 3)
|
||
|
(check-not-equal? (len "fo") 3) ; len 2
|
||
|
(check-equal? (len 'foo) 3)
|
||
|
(check-not-equal? (len 'fo) 3) ; len 2
|
||
|
(check-equal? (len (list->vector '(1 2 3))) 3)
|
||
|
(check-not-equal? (len (list->vector '(1 2))) 3) ; len 2
|
||
|
(check-equal? (len (set 1 2 3)) 3)
|
||
|
(check-not-equal? (len (set 1 2)) 3) ; len 2
|
||
|
(check-equal? (len (make-hash '((a . 1) (b . 2) (c . 3)))) 3)
|
||
|
(check-not-equal? (len (make-hash '((a . 1) (b . 2)))) 3)) ; len 2
|