diff --git a/lens/private/struct/main.rkt b/lens/private/struct/main.rkt index 5d8ab08..cb72ae6 100644 --- a/lens/private/struct/main.rkt +++ b/lens/private/struct/main.rkt @@ -1,3 +1,5 @@ -#lang reprovide +#lang sweet-exp reprovide "field.rkt" -"struct.rkt" +except-in "struct.rkt" + struct-lenses-out + struct+lenses-out diff --git a/lens/private/struct/struct.rkt b/lens/private/struct/struct.rkt index d3fcd61..c5ef31d 100644 --- a/lens/private/struct/struct.rkt +++ b/lens/private/struct/struct.rkt @@ -2,6 +2,7 @@ (require syntax/parse/define alexis/util/struct + racket/provide-syntax "../base/main.rkt" (submod alexis/util/struct get-struct-accessors) (for-syntax racket/base @@ -15,7 +16,9 @@ "../test-util/test-lens.rkt")) (provide define-struct-lenses - struct/lens) + struct/lens + struct-lenses-out + struct+lenses-out) (define-for-syntax (get-struct-field-ids struct-info failure-context) @@ -55,6 +58,18 @@ (struct s (field-spec ...) option ...) (define-struct-lenses s))) +(define-provide-syntax struct-lenses-out + (syntax-parser + [(struct-lenses-out struct-type:id) + #:do [(define field-ids (get-struct-id-field-ids #'struct-type))] + #:with [lens-id ...] (map-format-id #'struct-type "~a-lens" field-ids) + #'(combine-out lens-id ...)])) + +(define-provide-syntax struct+lenses-out + (syntax-parser + [(struct+lenses-out struct-type:id) + #'(combine-out (struct-out struct-type) (struct-lenses-out struct-type))])) + (module+ test (struct/lens foo (a b c d) #:transparent) (check-lens-view foo-b-lens (foo 1 2 3 4) 2) diff --git a/unstable/lens/main.rkt b/unstable/lens/main.rkt index 4039d98..2ceccd9 100644 --- a/unstable/lens/main.rkt +++ b/unstable/lens/main.rkt @@ -13,6 +13,7 @@ "string-split.rkt" "struct-join.rkt" "struct-nested.rkt" +"struct-provide.rkt" "sublist.rkt" "syntax.rkt" "view-set.rkt" diff --git a/unstable/lens/main.scrbl b/unstable/lens/main.scrbl index 00c6ef1..a9445e7 100644 --- a/unstable/lens/main.scrbl +++ b/unstable/lens/main.scrbl @@ -26,6 +26,7 @@ this library being backwards-compatible. "string-split.scrbl" "struct-join.scrbl" "struct-nested.scrbl" + "struct-provide.scrbl" "sublist.scrbl" "syntax.scrbl" "view-set.scrbl" diff --git a/unstable/lens/struct-provide.rkt b/unstable/lens/struct-provide.rkt new file mode 100644 index 0000000..d9601dd --- /dev/null +++ b/unstable/lens/struct-provide.rkt @@ -0,0 +1,4 @@ +#lang sweet-exp reprovide +only-in lens/private/struct/struct + struct-lenses-out + struct+lenses-out diff --git a/unstable/lens/struct-provide.scrbl b/unstable/lens/struct-provide.scrbl new file mode 100644 index 0000000..3eee241 --- /dev/null +++ b/unstable/lens/struct-provide.scrbl @@ -0,0 +1,17 @@ +#lang scribble/manual + +@(require lens/private/doc-util/main) + +@title{Struct-lens provide forms} + +@defmodule[unstable/lens/struct-provide] + +@defform[(struct-lenses-out struct-id)]{ +A @racket[provide] sub-form that provides the lenses defined by +@racket[define-struct-lenses] or @racket[struct/lens]. +} + +@defform[(struct+lenses-out struct-id)]{ +A @racket[provide] sub-form short for using both @racket[struct-out] and +@racket[struct-lenses-out]. +}