-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsv.zp
98 lines (90 loc) · 3.27 KB
/
sv.zp
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
(define-record-type semver:semantic-version
(semver:make-semantic-version major minor patch comp)
semver:semantic-version?
(major semver:get-major)
(minor semver:get-minor)
(patch semver:get-patch)
(comp semver:get-comp))
(module "semver"
(export
(list "matches" matches)
(list "gt" gt)
(list "lt" lt)
(list "eq" eq)
(list "ne" ne)
(list "ge" ge)
(list "le" le)
(list "valid?" valid)
(list "parse" parse))
(comparators {">=" "<=" ">" "<" "==" "!="})
(matches (lambda (x y)
(let* ((x (if (string? x) (parse x) x))
(y (if (string? y) (parse y) y))
(constraint (let ((comp (semver:get-comp y)))
(if (null? comp) eq (or (comparator-map comp) eq)))))
(constraint x y))))
(gt (lambda (x y)
(let ((x (if (string? x) (parse x) x))
(y (if (string? y) (parse y) y)))
(if (> (semver:get-major x)
(semver:get-major y))
#t
(if (< (semver:get-major x)
(semver:get-major y))
#f
(if (> (semver:get-minor x)
(semver:get-minor y))
#t
(if (< (semver:get-minor x)
(semver:get-minor y))
#f
(> (semver:get-patch x)
(semver:get-patch y)))))))))
(lt (lambda (x y) (not (or (gt x y) (eq x y)))))
(eq (lambda (x y)
(let ((x (if (string? x) (parse x) x))
(y (if (string? y) (parse y) y)))
(and
(= (semver:get-major x)
(semver:get-major y))
(= (semver:get-minor x)
(semver:get-minor y))
(= (semver:get-patch x)
(semver:get-patch y))))))
(ne (lambda (x y) (not (eq x y))))
(ge (lambda (x y) (or (eq x y) (gt x y))))
(le (lambda (x y) (or (eq x y) (lt x y))))
(comparator-map (make-hash ">=" ge "<=" le ">" gt "<" lt "==" eq "!=" ne))
(parse (lambda (str)
(let* ((split (string:split str #\.))
(minor (get-from split 1))
(patch (get-from split 2))
(majc (let ((m (get-from split 0)))
(and (truthy? m)
(if (string:num? m)
(list (nil) m)
(let* ((l (map (curry string:starts-with str)
(vector->list comparators)))
(i (index-of l #t)))
(if (any? truthy? l)
(list
(substring m 0 (length (comparators i)))
(substring m (length (comparators i)) (length m)))
(list (nil) (nil))))))))
(major (cadr majc))
(comp (car majc)))
(if (all? (lambda (x) (and (truthy? x) (string:num? x)))
(list major minor patch))
(semver:make-semantic-version
(string->integer major)
(string->integer minor)
(string->integer patch)
comp)
(nil)))))
(valid (lambda (str)
(semver:semantic-version? (parse str)))))
(import-all "semver")
(defimpl ord semver:semantic-version?
((compare (lambda (x y) (if (semver:eq x y) 0 (if (semver:lt x y) -1 1))))))
(defimpl stringify semver:semantic-version?
((->string (lambda (s) (++ "semver: " (->string (semver:get-major s)) "." (->string (semver:get-minor s)) "." (->string (semver:get-patch s)))))))