-
Notifications
You must be signed in to change notification settings - Fork 0
/
pacer.clj
65 lines (56 loc) · 2.17 KB
/
pacer.clj
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
(ns pacer
(:import
(com.tinkerpop.blueprints.impls.tg TinkerGraph)
(com.tinkerpop.gremlin.pipes.transform InEdgesPipe))
(:use [clojure.pprint :only [pprint]]
pacer.step))
(defn simple-encoder [] { :encode nil :decode nil })
(defn show
"Show an easy to read"
[route]
(->> route
(map describe-step)
(clojure.string/join " -> ")))
(defn- pipe-from-step [in step]
(cond
(:pipe step) (doto ((:pipe step) in)
(.setStarts (:pipe in (:source in))))
(:iterator step) ((:iterator step) (:pipe in (:source in)))
:else (throw (Exception. "Don't know how to build step"))))
(defn build-pipe [[source & route]]
(if route
(reduce (fn [in step]
(check-step in step)
{ :pipe (pipe-from-step in step)
:type (:type step (:type in))
:route (conj (:route in) step)})
{ :source source, :type (:type source), :route [] }
route)
source))
(defn pipe
"Build a pipe from a route definition"
[route]
(:pipe (build-pipe route)))
(defmacro route [& steps]
(vec (map (fn [step]
`(let [step# ~step]
(if (map? step#)
step#
~(list step))))
steps)))
(comment
(route g v (loop (out-e :x) in-v :max 5 :while ??))
(route g v (loop { max: 5 } (out-e :x) in-v))
(route g v (loop
(fn [v path loop emit] (loop) (emit path))
; fn could use CPS. would that cause stack overflow?
; we could cause the continuations to enqueue the elemnent and return, not actually continue
; cps advantage is that I could use args to emit other things than simply the current element if I gave it args.
:emit-if #() ; return t/f
:loop-if #() ; return t/f
:max-depth 4 ; would not call loop-if when at max
:min-depth 2 ; would not emit or call emit-if
(out-e :x) in-v))
(route g v (branch { :a (v out-e) :b (v in out)} ) (merge :a :b))
(route g v (lookahead out { :name "Frank" } (in :knows) #{ some-vertex }))
)