racket/collects/syntax-color/lexer-contract.rkt
Robby Findler 761054890d extend the lexer <-> framework's color:text api
to let lexers say "call me again before you change the buffer"

also, use this in the 2d lexer
2013-03-10 20:17:20 -05:00

39 lines
1.3 KiB
Racket

#lang racket/base
(require racket/contract/base
unstable/options)
(provide lexer/c (struct-out dont-stop))
(struct dont-stop (val) #:transparent)
(define lexer/c
(option/c
(or/c (->i ([in (and/c input-port? port-counts-lines?)])
(values [txt any/c]
[type symbol?]
[paren (or/c symbol? #f)]
[start (or/c exact-positive-integer? #f)]
[end (start type) (end/c start type)]))
(->i ([in (and/c input-port? port-counts-lines?)]
[offset exact-nonnegative-integer?]
[mode (not/c dont-stop?)])
(values [txt any/c]
[type symbol?]
[paren (or/c symbol? #f)]
[start (or/c exact-positive-integer? #f)]
[end (start type) (end/c start type)]
[backup exact-nonnegative-integer?]
[new-mode any/c])))
#:tester (λ (x) (and (procedure? x)
(or (procedure-arity-includes? x 1)
(procedure-arity-includes? x 3))))))
(define (end/c start type)
(cond
[(equal? 'eof type)
(or/c exact-positive-integer? #f)]
[start
(and/c exact-positive-integer?
(>/c start))]
[else
#f]))