File: container.rkt

package info (click to toggle)
racket 7.9%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 178,684 kB
  • sloc: ansic: 282,112; lisp: 234,887; pascal: 70,954; sh: 27,112; asm: 16,268; makefile: 4,613; cpp: 2,715; ada: 1,681; javascript: 1,244; cs: 879; exp: 499; csh: 422; python: 274; xml: 106; perl: 104
file content (56 lines) | stat: -rw-r--r-- 1,558 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#lang racket/base
(require web-server/dispatchers/dispatch
         racket/list
         racket/contract
         racket/match
         "syntax.rkt")

(struct container (bunches) #:mutable)
(struct bunch (dispatch url))

(define (container-dispatch c)
  (λ (req)
    (let/ec esc
      (for ([d*u (in-list (container-bunches c))])
        (with-handlers ([exn:dispatcher? void])
          (esc ((bunch-dispatch d*u) req))))
      (next-dispatcher))))

(define (container-url c)
  (λ args
    (let/ec esc
      (for ([d*u (in-list (container-bunches c))])
        (with-handlers ([exn:misc:match? void])
          (esc (apply (bunch-url d*u) args))))
      (match args))))

(define-syntax-rule (define-container container-id (container-dispatch-id container-url-id))
  (begin
    (define container-id
      (container empty))
    (define container-dispatch-id
      (container-dispatch container-id))
    (define container-url-id
      (container-url container-id))))

(define (container-cons! c d u)
  (set-container-bunches! 
   c
   (cons (bunch d u) (container-bunches c))))

#;(define (snoc l x) (append l (list x)))
#;(define (container-snoc! c d u)
    (set-container-bunches! 
     c
     (snoc (container-bunches c) (bunch d u))))

(define-syntax-rule (dispatch-rules! container-expr pattern-clause ...)
  (let-values ([(dispatch url) (dispatch-rules pattern-clause ...)])
    (container-cons! container-expr
                     dispatch url)))

(provide
 define-container
 dispatch-rules!)
(provide/contract
 [container? (any/c . -> . boolean?)])