Change lens-view*
This commit is contained in:
parent
4a05f25f06
commit
62e0073af6
|
@ -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)))
|
||||
|
|
|
@ -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)
|
||||
]}
|
||||
|
|
Loading…
Reference in New Issue
Block a user