-
Notifications
You must be signed in to change notification settings - Fork 4
/
path.cljc
46 lines (43 loc) · 1.39 KB
/
path.cljc
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
(ns com.yetanalytics.flint.spec.path
(:require [clojure.spec.alpha :as s]
[com.yetanalytics.flint.spec.axiom :as ax]))
(def path-terminal-spec
(s/and
(comp not list?)
(s/or :ax/iri ax/iri?
:ax/prefix-iri ax/prefix-iri?
:ax/rdf-type ax/rdf-type?)))
(s/def ::path-neg
(s/or :path/terminal
path-terminal-spec
:path/branch
(s/and
list?
(comp symbol? first)
(s/or :path/varardic
(s/cat :path/op #{'alt}
:path/paths (s/* ::path-neg)))
(s/conformer second)
(s/conformer #(into [] %)))))
(s/def ::path
(s/or :path/terminal
path-terminal-spec
:path/branch
(s/and
list?
(comp symbol? first)
(s/or :path/varardic
(s/cat :path/op #{'alt 'cat}
:path/paths (s/* ::path))
:path/unary
(s/cat :path/op #{'inv '? '* '+}
:path/path ::path)
:path/unary-neg
(s/cat :path/op #{'not}
:path/path ::path-neg))
(s/conformer second)
(s/conformer (fn [{op :path/op
path :path/path
paths :path/paths}]
[[:path/op op]
[:path/paths (if path [path] paths)]])))))