From e976bea02ce563d65290d4b2e6f6450079ca1fd5 Mon Sep 17 00:00:00 2001 From: AlexKnauth Date: Tue, 28 Jul 2015 18:06:24 -0400 Subject: [PATCH] add lens/c --- lens/base/base.rkt | 7 ++++++- lens/base/contract.scrbl | 16 ++++++++++++++++ lens/base/main.scrbl | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 lens/base/contract.scrbl diff --git a/lens/base/base.rkt b/lens/base/base.rkt index 70b3750..17eaec7 100644 --- a/lens/base/base.rkt +++ b/lens/base/base.rkt @@ -12,7 +12,9 @@ [focus-lens (-> lens? any/c (values any/c (-> any/c any/c)))] [use-applicable-lenses! (-> void?)] - [lens? predicate/c])) + [lens? predicate/c] + [lens/c (contract? contract? . -> . contract?)] + )) (define lenses-applicable? (make-parameter #f)) @@ -27,6 +29,9 @@ ((lens-struct-get this) target) (error "cannot apply a non-applicable lens as a function")))) +(define (lens/c target/c view/c) + (struct/c lens-struct (-> target/c view/c) (-> target/c view/c target/c))) + (module+ test (require rackunit) (check-exn exn:fail? (thunk (first-lens '(a b c))))) diff --git a/lens/base/contract.scrbl b/lens/base/contract.scrbl new file mode 100644 index 0000000..2cd367f --- /dev/null +++ b/lens/base/contract.scrbl @@ -0,0 +1,16 @@ +#lang scribble/manual + +@(require lens/doc-util/main) + +@title{Lens Contracts} + +@defproc[(lens/c [target/c contract?] [view/c contract?]) contract?]{ +A contract constructor for lenses. The @racket[target/c] contract is used for +the second argument in @racket[(lens-view lens target)], the second argument +and the return value of @racket[(lens-set lens target view)], for example, the +@racket[view/c] contract is used for the return value of +@racket[(lens-view lens target)] and the third argument of +@racket[(lens-set lens target view)], as well as other places where targets or +views of the lens are used as inputs or outputs. +} + diff --git a/lens/base/main.scrbl b/lens/base/main.scrbl index dc5c101..56df65d 100644 --- a/lens/base/main.scrbl +++ b/lens/base/main.scrbl @@ -6,4 +6,5 @@ @include-section["view-set.scrbl"] @include-section["laws.scrbl"] @include-section["transform.scrbl"] +@include-section["contract.scrbl"] @include-section["compose.scrbl"]