diff --git a/lenses/applicable.rkt b/lenses/applicable.rkt new file mode 100644 index 0000000..fcf8377 --- /dev/null +++ b/lenses/applicable.rkt @@ -0,0 +1,42 @@ +#lang racket/base + +(provide (all-defined-out) + lens/c let-lens lens-view lens-set lens-transform lens-struct lens-proc) + +(require (prefix-in - "main.rkt") + (only-in "main.rkt" + lens/c let-lens lens-view lens-set lens-transform lens-struct lens-proc)) + +(define (make-lens getter setter) + (lens-struct (-make-lens getter setter))) + +(define (lens-compose . args) + (lens-struct (apply -lens-compose args))) + +(define identity-lens + (lens-struct -identity-lens)) + +(define (list-lens n) + (lens-struct (-list-lens n))) + +(define first-lens (lens-struct -first-lens)) +(define second-lens (lens-struct -second-lens)) +(define third-lens (lens-struct -third-lens)) +(define fourth-lens (lens-struct -fourth-lens)) +(define fifth-lens (lens-struct -fifth-lens)) + +(define (assoc-lens key #:is-equal? [key-equal? equal?]) + (lens-struct (-assoc-lens key #:is-equal? key-equal?))) + +(define (assv-lens key) + (lens-struct (-assv-lens key))) + +(define (assq-lens key) + (lens-struct (-assq-lens key))) + +(define-syntax-rule (syntax-lens target-id pattern) + (lens-struct (-syntax-lens target-id pattern))) + +(define-syntax-rule (syntax-keyword-seq-lens kw) + (lens-struct (-syntax-keyword-seq-lens kw))) + diff --git a/lenses/lenses.scrbl b/lenses/lenses.scrbl index 9fc9525..4c2d7b7 100644 --- a/lenses/lenses.scrbl +++ b/lenses/lenses.scrbl @@ -251,3 +251,12 @@ used directly as a getter procedure. Gets a lens function. If @racket[lens] is a lens function but not a lens struct, returns the @racket[lens]. } + +@section{lenses/applicable} + +@defmodule[lenses/applicable] + +This module provides the same functions as @racketmodname[lenses], but lenses +are provided as applicable lens structs, and functions that return lenses return +lens structs. +