143 lines
4.8 KiB
Racket
143 lines
4.8 KiB
Racket
#lang typed/racket
|
|
|
|
(require phc-toolkit
|
|
xlist
|
|
type-expander
|
|
"../split-xlist.rkt")
|
|
|
|
(check-equal?:
|
|
(((inst f-split-list Number (Listof Symbol))
|
|
(make-predicate (Listof Symbol))) (ann '(1 2 3 a b)
|
|
(xlist Number⃰ Symbol⃰)))
|
|
: (List (Listof Number)
|
|
(Listof Symbol))
|
|
'((1 2 3) (a b)))
|
|
|
|
(check-equal?:
|
|
(let ()
|
|
(m-split-xlist* (ann '(1 2 3 d e f 7 8 9 . 42)
|
|
(xlist Number⃰ Symbol⃰ Number⃰ . Number))
|
|
[n1 s n2 r]
|
|
Number ^ {*}
|
|
Symbol ^ {*}
|
|
Number ^ {*}
|
|
#:rest Number)
|
|
(list n1 s n2 r))
|
|
: (List (Listof Number)
|
|
(Listof Symbol)
|
|
(Listof Number)
|
|
Number)
|
|
'((1 2 3) (d e f) (7 8 9) 42))
|
|
|
|
(check-equal?:
|
|
(let ()
|
|
(m-split-xlist* (ann '(1 2 3 d e f 7 8 9) (xlist Number⃰ Symbol⃰ Number⃰))
|
|
[n1 s n2 nul]
|
|
Number ^ {*}
|
|
Symbol ^ {*}
|
|
Number ^ {*}
|
|
#:rest Null)
|
|
(list n1 s n2 nul))
|
|
: (List (Listof Number)
|
|
(Listof Symbol)
|
|
(Listof Number)
|
|
Null)
|
|
'((1 2 3) (d e f) (7 8 9) ()))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 d e f 7 8 9) (xlist Number⃰ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d) Number⃰ Symbol⃰ Number⃰)
|
|
(list d c b a)])
|
|
: (List Null (Listof Number) (Listof Symbol) (Listof Number))
|
|
'(() (7 8 9) (d e f) (1 2 3)))
|
|
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 d e f 7 8 9) (xlist Number Number⃰ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d e) Number Number⃰ Symbol⃰ Number⃰)
|
|
(list e d c b a)])
|
|
: (List Null (Listof Number) (Listof Symbol) (Listof Number) Number)
|
|
'(() (7 8 9) (d e f) (2 3) 1))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 d e f 7 8 9) (xlist Number² Number⃰ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d e) Number² Number⃰ Symbol⃰ Number⃰)
|
|
(list e d c b a)])
|
|
: (List Null
|
|
(Listof Number)
|
|
(Listof Symbol)
|
|
(Listof Number)
|
|
(List Number Number))
|
|
'(() (7 8 9) (d e f) (3) (1 2)))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 d e f 7 8 9) (xlist Number²⁻³ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d) Number²⁻³ Symbol⃰ Number⃰)
|
|
(list d c b a)])
|
|
: (List Null
|
|
(Listof Number)
|
|
(Listof Symbol)
|
|
(List* Number Number (U Null (List Number))))
|
|
'(() (7 8 9) (d e f) (1 2 3)))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 4 5 d e f 7 8 9) (xlist Number³⁻⁵ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d) Number³⁻⁵ Symbol⃰ Number⃰)
|
|
(list d c b a)])
|
|
: (List Null
|
|
(Listof Number)
|
|
(Listof Symbol)
|
|
(List* Number Number Number (U Null
|
|
(List Number)
|
|
(List Number Number))))
|
|
'(() (7 8 9) (d e f) (1 2 3 4 5)))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 4 d e f 7 8 9) (xlist Number³⁻⁵ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d) Number³⁻⁵ Symbol⃰ Number⃰)
|
|
(list d c b a)])
|
|
: (List Null
|
|
(Listof Number)
|
|
(Listof Symbol)
|
|
(List* Number Number Number (U Null
|
|
(List Number)
|
|
(List Number Number))))
|
|
'(() (7 8 9) (d e f) (1 2 3 4)))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 d e f 7 8 9) (xlist Number³⁻⁵ Symbol⃰ Number⃰))
|
|
[(split-xlist (list a b c d) Number³⁻⁵ Symbol⃰ Number⃰)
|
|
(list d c b a)])
|
|
: (List Null
|
|
(Listof Number)
|
|
(Listof Symbol)
|
|
(xlist Number³⁻⁵))
|
|
'(() (7 8 9) (d e f) (1 2 3)))
|
|
|
|
(check-equal?:
|
|
(match (ann '(1 2 3 4 d e f g 7 8 9) (xlist Number³⁻⁵ Symbol²⁻⁶ Number⃰))
|
|
[(split-xlist (list a b c d) Number³⁻⁵ Symbol²⁻⁶ Number⃰)
|
|
(list d c b a)])
|
|
: (List Null
|
|
(Listof Number)
|
|
(List* Symbol Symbol (U Null
|
|
(List Symbol)
|
|
(List Symbol Symbol)
|
|
(List Symbol Symbol Symbol)
|
|
(List Symbol Symbol Symbol Symbol)))
|
|
(List* Number Number Number (U Null
|
|
(List Number)
|
|
(List Number Number))))
|
|
'(() (7 8 9) (d e f g) (1 2 3 4)))
|
|
|
|
(check-equal?: (match (ann (list 1 "flob") Any)
|
|
[(and (? (make-predicate (xlist Fixnum String)))
|
|
(split-xlist whole Fixnum String)) whole])
|
|
: (List Fixnum String Null)
|
|
'(1 "flob" ()))
|
|
|
|
(check-equal?: (match (list 1 "flob")
|
|
[(and (? (make-predicate (xlist Fixnum String)))
|
|
(split-xlist whole Fixnum String)) whole])
|
|
: (List One String Null)
|
|
'(1 "flob" ())) |