diff --git a/lens/base/contract.rkt b/lens/base/contract.rkt index 52c38ac..aae3889 100644 --- a/lens/base/contract.rkt +++ b/lens/base/contract.rkt @@ -3,6 +3,7 @@ (provide lens/c) (require racket/contract/base + unstable/contract "gen-lens.rkt" ) (module+ test @@ -13,10 +14,12 @@ )) (define (lens/c target/c view/c) - (gen-lens/c - [lens-view (or/c #f [lens? target/c . -> . view/c])] - [lens-set (or/c #f [lens? target/c view/c . -> . target/c])] - [focus-lens (or/c #f [lens? target/c . -> . (values view/c [view/c . -> . target/c])])])) + (rename-contract + (gen-lens/c + [lens-view (or/c #f [lens? target/c . -> . view/c])] + [lens-set (or/c #f [lens? target/c view/c . -> . target/c])] + [focus-lens (or/c #f [lens? target/c . -> . (values view/c [view/c . -> . target/c])])]) + `(lens/c ,(contract-name target/c) ,(contract-name view/c)))) (module+ test (check-exn exn:fail:contract? diff --git a/lens/util/immutable.rkt b/lens/util/immutable.rkt index 9f82d91..781444f 100644 --- a/lens/util/immutable.rkt +++ b/lens/util/immutable.rkt @@ -2,6 +2,8 @@ (provide (all-defined-out)) +(require racket/vector) + ;; The immutable? predicate only works for strings, byte-strings, vectors, hash-tables, and boxes. (define (immutable-string? v) @@ -31,3 +33,6 @@ (define (build-immutable-vector n f) (vector->immutable-vector (build-vector n f))) +(define (immutable-vector-map f v) + (vector->immutable-vector (vector-map f v))) + diff --git a/unstable/lens/mapper.rkt b/unstable/lens/mapper.rkt index c74cb58..12ade24 100644 --- a/unstable/lens/mapper.rkt +++ b/unstable/lens/mapper.rkt @@ -49,6 +49,7 @@ '#(a c e)) (check-equal? (lens-set (vector-mapper-lens first-lens) '#((a b) (c d) (e f)) '#(1 2 3)) '#((1 b) (2 d) (3 f))) - (check-equal? (lens-transform (vector-mapper-lens first-lens) '#((a b) (c d) (e f)) (vector-map symbol->string _)) + (check-equal? (lens-transform (vector-mapper-lens first-lens) '#((a b) (c d) (e f)) + (immutable-vector-map symbol->string _)) '#(("a" b) ("c" d) ("e" f))) ) diff --git a/unstable/lens/mapper.scrbl b/unstable/lens/mapper.scrbl index e6e7933..7e0a2ba 100644 --- a/unstable/lens/mapper.scrbl +++ b/unstable/lens/mapper.scrbl @@ -19,5 +19,6 @@ Creates a lens that maps @racket[lens] over a target vector with @racket[vector- @lenses-unstable-examples[ (lens-view (vector-mapper-lens first-lens) '#((a b) (c d) (e f))) (lens-set (vector-mapper-lens first-lens) '#((a b) (c d) (e f)) '#(1 2 3)) - (lens-transform (vector-mapper-lens first-lens) '#((a b) (c d) (e f)) (λ (xs) (vector-map symbol->string xs))) + (lens-transform (vector-mapper-lens first-lens) '#((a b) (c d) (e f)) + (λ (xs) (vector->immutable-vector (vector-map symbol->string xs)))) ]}