diff --git a/unstable/lens/compound.rkt b/unstable/lens/compound.rkt index 1bf635f..467d92a 100644 --- a/unstable/lens/compound.rkt +++ b/unstable/lens/compound.rkt @@ -1,6 +1,7 @@ #lang racket -(require lens +(require fancy-app + lens unstable/sequence) (module+ test @@ -36,15 +37,25 @@ first-lens)) +(define (value-list->hash keys vs) + (make-immutable-hash (map cons keys vs))) + +(define (split-slice n vs) + (define grouped + (for/list ([group (in-slice n vs)]) + group)) + (define (get-ith i) + (map (list-ref _ i) grouped)) + (build-list n get-ith)) + +(module+ test + (check-equal? (split-slice 3 '(a 1 FOO b 2 BAR c 3 BAZ)) + '((a b c) (1 2 3) (FOO BAR BAZ)))) + + (define (compound-hash-lens . keys/lenses) - (define grouped-keys/lenses - (for/list ([key/lens (in-slice 2 keys/lenses)]) - key/lens)) - (define keys (map first grouped-keys/lenses)) - (define lenses (map second grouped-keys/lenses)) + (match-define (list keys lenses) (split-slice 2 keys/lenses)) (define list-lens (apply compound-list-lens lenses)) - (define (value-list->hash keys xs) - (make-immutable-hash (map cons keys xs))) (define (get target) (value-list->hash keys (lens-view list-lens target))) (define (set target new-view-hash)