/collects/typed/srfi/14.rkt

http://github.com/gmarceau/PLT · Racket · 227 lines · 198 code · 16 blank · 13 comment · 14 complexity · 015a5b13ae9e373b4a57fb3637b5ca01 MD5 · raw file

  1. #lang typed-scheme
  2. (require/opaque-type Char-Set char-set? srfi/14)
  3. (define-type-alias Cursor (Pair 0 (Listof (Pair Integer Integer))))
  4. (provide Char-Set Cursor)
  5. (require/typed
  6. srfi/14
  7. ;; Predicates & comparison
  8. [char-set= (Char-Set * -> Boolean)]
  9. [char-set<= (Char-Set * -> Boolean)]
  10. [char-set-hash
  11. (case-lambda (Char-Set -> Integer)
  12. (Char-Set Integer -> Integer))]
  13. ;; Iterating over character sets
  14. [char-set-cursor (Char-Set -> Cursor)]
  15. [char-set-ref (Char-Set Cursor -> Char)]
  16. [char-set-cursor-next (Char-Set Cursor -> Cursor)]
  17. [end-of-char-set? (Cursor -> Boolean)]
  18. [char-set-map ((Char -> Char) Char-Set -> Char-Set)]
  19. ;; Creating character sets
  20. [char-set-copy (Char-Set -> Char-Set)]
  21. [char-set (Char * -> Char-Set)]
  22. [list->char-set
  23. (case-lambda
  24. ((Listof Char) -> Char-Set)
  25. ((Listof Char) Char-Set -> Char-Set))]
  26. [list->char-set! ((Listof Char) Char-Set -> Char-Set)]
  27. [string->char-set
  28. (case-lambda
  29. (String -> Char-Set)
  30. (String Char-Set -> Char-Set))]
  31. [string->char-set! (String Char-Set -> Char-Set)]
  32. [char-set-filter
  33. (case-lambda
  34. ((Char -> Any) Char-Set -> Char-Set)
  35. ((Char -> Any) Char-Set Char-Set -> Char-Set))]
  36. [char-set-filter!
  37. ((Char -> Any) Char-Set Char-Set -> Char-Set)]
  38. [ucs-range->char-set
  39. (case-lambda (Integer Integer -> Char-Set)
  40. (Integer Integer Any -> Char-Set)
  41. (Integer Integer Any Char-Set -> Char-Set))]
  42. [ucs-range->char-set!
  43. (Integer Integer Any Char-Set -> Char-Set)]
  44. [->char-set ((U String Char Char-Set) -> Char-Set)]
  45. ;; Querying character sets
  46. [char-set-size (Char-Set -> Integer)]
  47. [char-set-count ((Char -> Any) Char-Set -> Integer)]
  48. [char-set->list (Char-Set -> (Listof Char))]
  49. [char-set->string (Char-Set -> String)]
  50. [char-set-contains? (Char-Set Char -> Boolean)]
  51. ;; Character-set algebra
  52. [char-set-adjoin (Char-Set Char * -> Char-Set)]
  53. [char-set-delete (Char-Set Char * -> Char-Set)]
  54. [char-set-adjoin! (Char-Set Char * -> Char-Set)]
  55. [char-set-delete! (Char-Set Char * -> Char-Set)]
  56. [char-set-complement (Char-Set -> Char-Set)]
  57. [char-set-union (Char-Set * -> Char-Set)]
  58. [char-set-intersection (Char-Set * -> Char-Set)]
  59. [char-set-difference (Char-Set Char-Set * -> Char-Set)]
  60. [char-set-xor (Char-Set * -> Char-Set)]
  61. [char-set-diff+intersection
  62. (Char-Set Char-Set * -> (values Char-Set Char-Set))]
  63. [char-set-complement! (Char-Set -> Char-Set)]
  64. [char-set-union! (Char-Set Char-Set * -> Char-Set)]
  65. [char-set-intersection! (Char-Set Char-Set * -> Char-Set)]
  66. [char-set-difference! (Char-Set Char-Set * -> Char-Set)]
  67. [char-set-xor! (Char-Set Char-Set * -> Char-Set)]
  68. [char-set-diff+intersection!
  69. (Char-Set Char-Set Char-Set * -> (values Char-Set Char-Set))]
  70. ;; Standard character sets
  71. [char-set:lower-case Char-Set]
  72. [char-set:upper-case Char-Set]
  73. [char-set:title-case Char-Set]
  74. [char-set:letter Char-Set]
  75. [char-set:digit Char-Set]
  76. [char-set:letter+digit Char-Set]
  77. [char-set:graphic Char-Set]
  78. [char-set:printing Char-Set]
  79. [char-set:whitespace Char-Set]
  80. [char-set:iso-control Char-Set]
  81. [char-set:punctuation Char-Set]
  82. [char-set:symbol Char-Set]
  83. [char-set:hex-digit Char-Set]
  84. [char-set:blank Char-Set]
  85. [char-set:ascii Char-Set]
  86. [char-set:empty Char-Set]
  87. [char-set:full Char-Set]
  88. [char-set-fold (All (A) ((Char A -> A) A Char-Set -> A))]
  89. [char-set-unfold
  90. (All (A)
  91. (case-lambda
  92. ((A -> Any) (A -> Char) (A -> A) A -> Char-Set)
  93. ((A -> Any) (A -> Char) (A -> A) A Char-Set -> Char-Set)))]
  94. [char-set-unfold!
  95. (All (A) ((A -> Any) (A -> Char) (A -> A) A Char-Set -> Char-Set))]
  96. [char-set-for-each (All (A) ((Char -> A) Char-Set -> (U A Void)))]
  97. [char-set-any (All (A) ((Char -> A) Char-Set -> (U A #f)))]
  98. [char-set-every (All (A) ((Char -> A) Char-Set -> (U A Boolean)))]
  99. ) ; end of require/typed
  100. ;; Definitions provided here for polymorphism
  101. #;
  102. (define (char-set-fold comb base cs)
  103. (let loop ((c (char-set-cursor cs)) (b base))
  104. (cond [(end-of-char-set? c) b]
  105. [else
  106. (loop (char-set-cursor-next cs c)
  107. (comb (char-set-ref cs c) b))])))
  108. #;
  109. (define char-set-unfold
  110. (pcase-lambda: (A)
  111. [([p : (A -> Any)] [f : (A -> Char)] [g : (A -> A)] [seed : A])
  112. (char-set-unfold p f g seed char-set:empty)]
  113. [([p : (A -> Any)] [f : (A -> Char)] [g : (A -> A)] [seed : A]
  114. [base-cs : Char-Set])
  115. (char-set-unfold! p f g seed (char-set-copy base-cs))]))
  116. #;
  117. (define (char-set-unfold! p f g seed base-cs)
  118. (let lp ((seed seed) (cs base-cs))
  119. (if (p seed) cs ; P says we are done.
  120. (lp (g seed) ; Loop on (G SEED).
  121. (char-set-adjoin! cs (f seed))))))
  122. #;
  123. (define (char-set-for-each f cs)
  124. (char-set-fold (lambda: ([c : Char] [b : (U A Void)]) (f c))
  125. (void)
  126. cs))
  127. #;
  128. (define (char-set-any pred cs)
  129. (let loop ((c (char-set-cursor cs)))
  130. (and (not (end-of-char-set? c))
  131. (or (pred (char-set-ref cs c))
  132. (loop (char-set-cursor-next cs c))))))
  133. #;
  134. (define (char-set-every pred cs)
  135. (let loop ((c (char-set-cursor cs)) (b (ann #t (U #t A))))
  136. (cond [(end-of-char-set? c) b]
  137. [else (and b
  138. (loop (char-set-cursor-next cs c)
  139. (pred (char-set-ref cs c))))])))
  140. (provide
  141. ;; Predicates & comparison
  142. char-set?
  143. char-set=
  144. char-set<=
  145. char-set-hash
  146. ;; Iterating over character sets
  147. char-set-cursor
  148. char-set-ref
  149. char-set-cursor-next
  150. end-of-char-set?
  151. char-set-fold
  152. char-set-unfold
  153. char-set-unfold!
  154. char-set-for-each
  155. char-set-map
  156. ;; Creating character sets
  157. char-set-copy
  158. char-set
  159. list->char-set
  160. list->char-set!
  161. string->char-set
  162. string->char-set!
  163. char-set-filter
  164. char-set-filter!
  165. ucs-range->char-set
  166. ucs-range->char-set!
  167. ->char-set
  168. ;; Querying character sets
  169. char-set-size
  170. char-set-count
  171. char-set->list
  172. char-set->string
  173. char-set-contains?
  174. char-set-every
  175. char-set-any
  176. ;; Character-set algebra
  177. char-set-adjoin
  178. char-set-delete
  179. char-set-adjoin!
  180. char-set-delete!
  181. char-set-complement
  182. char-set-union
  183. char-set-intersection
  184. char-set-difference
  185. char-set-xor
  186. char-set-diff+intersection
  187. char-set-complement!
  188. char-set-union!
  189. char-set-intersection!
  190. char-set-difference!
  191. char-set-xor!
  192. char-set-diff+intersection!
  193. ;; Standard character sets
  194. char-set:lower-case
  195. char-set:upper-case
  196. char-set:title-case
  197. char-set:letter
  198. char-set:digit
  199. char-set:letter+digit
  200. char-set:graphic
  201. char-set:printing
  202. char-set:whitespace
  203. char-set:iso-control
  204. char-set:punctuation
  205. char-set:symbol
  206. char-set:hex-digit
  207. char-set:blank
  208. char-set:ascii
  209. char-set:empty
  210. char-set:full
  211. ) ; end of provide