From 62e0073af6298dbd3c47f125e73331f2173767a8 Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Wed, 8 Jul 2015 10:55:06 -0700 Subject: [PATCH] Change lens-view* --- lens/base/view-set.rkt | 28 +++++++++++++--------------- lens/base/view-set.scrbl | 9 ++------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/lens/base/view-set.rkt b/lens/base/view-set.rkt index c63424b..6db0455 100644 --- a/lens/base/view-set.rkt +++ b/lens/base/view-set.rkt @@ -10,31 +10,30 @@ (provide (contract-out [lens-view (-> lens? any/c any/c)] - [lens-view* (->* (any/c) #:rest (listof lens?) any/c)] + [lens-view* (->* (any/c) #:rest (listof lens?) list?)] [lens-set (-> lens? any/c any/c any/c)] [lens-set* (->* (any/c) #:rest (listof2 lens? any/c) any/c)])) -(define (lens-view lens v) - (let-lens (view _) lens v +(define (lens-view lens target) + (let-lens (view _) lens target view)) -(define (lens-set lens v x) - (let-lens (_ setter) lens v +(define (lens-set lens target x) + (let-lens (_ setter) lens target (setter x))) -(define (lens-view* v . lenses) - (for/fold ([v v]) ([lens (in-list lenses)]) - (lens-view lens v))) +(define (lens-view* target . lenses) + (map (lens-view _ target) lenses)) -(define (lens-set* v . lenses/xs) +(define (lens-set* target . lenses/xs) (unless (even? (length lenses/xs)) (error 'lens-set* "expected an even number of association elements\n association elements: ~v" lenses/xs)) - (for/fold ([v v]) ([lens/x (in-slice 2 lenses/xs)]) + (for/fold ([target target]) ([lens/x (in-slice 2 lenses/xs)]) (match-define (list lens x) lens/x) - (lens-set lens v x))) + (lens-set lens target x))) (module+ test (define (set-first l v) @@ -45,10 +44,9 @@ (define second-lens (make-lens second set-second)) (check-equal? (lens-view first-lens '(1 2 3)) 1) (check-equal? (lens-set first-lens '(1 2 3) 'a) '(a 2 3)) - (check-equal? (lens-view* '((1 2) 3) first-lens second-lens) - 2) + (check-equal? (lens-view* '(1 2 3) first-lens second-lens) + '(1 2)) (check-equal? (lens-set* '(1 2 3) first-lens 10 second-lens 20) - '(10 20 3)) - ) + '(10 20 3))) diff --git a/lens/base/view-set.scrbl b/lens/base/view-set.scrbl index c847089..18789f4 100644 --- a/lens/base/view-set.scrbl +++ b/lens/base/view-set.scrbl @@ -24,13 +24,8 @@ ]} @defproc[(lens-view* [target target/c] [lens lens?] ...) view/c]{ - Like @racket[lens-view], except that it can take multiple lenses, - which are combined into a nested lens. The argument order is - switched, so that the @racket[target] comes first and the - @racket[lens] arguments come after it. - @racket[(lens-view* target lens ...)] produces the same value as - @racket[(lens-view (lens-thrush lens ...) target)], but can be more - efficient. + Like @racket[lens-view], except that it takes multiple lenses and + returns a list of views. @lenses-examples[ (lens-view* '(a b ((c d) e f) g) third-lens first-lens second-lens) ]}