-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathutils.rkt
More file actions
38 lines (30 loc) · 1.05 KB
/
utils.rkt
File metadata and controls
38 lines (30 loc) · 1.05 KB
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
#lang typed/racket/base
(provide (all-defined-out))
(require typed/json)
(: json-ref : (case->
[JSExpr Symbol -> JSExpr]
[JSExpr Symbol JSExpr -> JSExpr]))
(define json-ref
(case-lambda
[([object : JSExpr]
[key : Symbol])
(hash-ref (assert object hash?) key)]
[([object : JSExpr]
[key : Symbol]
[failure-result : JSExpr])
(hash-ref (assert object hash?) key (λ () failure-result))]))
(define (json-refs [object : JSExpr] [keys : (Listof Symbol)]) : JSExpr
(foldl
(λ ([key : Symbol] [obj : JSExpr]) (json-ref obj key))
object
keys))
(define (json-has-key? [object : JSExpr] [key : Symbol]) : Boolean
(hash-has-key? (assert object hash?) key))
(define (json-has-keys? [object : JSExpr] [keys : (Listof Symbol)]) : Boolean
(cond
[(null? keys) #t]
[else
(and (json-has-key? object (car keys))
(json-has-keys? (json-ref object (car keys)) (cdr keys)))]))
(define (upper-name [name : Symbol]) : Symbol
(string->symbol (string-titlecase (symbol->string name))))