; Follow-up — conversation threading via :reply-to closure. (feed-test name got expected) (define S (feed/stream (list (feed/normalize {:actor "a" :object "root" :at 1}) (feed/normalize {:actor "b" :object "r1" :at 2 :verb "reply" :reply-to "root"}) (feed/normalize {:actor "c" :object "r2" :at 3 :verb "reply" :reply-to "root"}) (feed/normalize {:actor "d" :object "r3" :at 4 :verb "reply" :reply-to "r1"}) (feed/normalize {:actor "e" :object "x" :at 5})))) ; ---------- direct replies ---------- (feed-test "direct replies to root" (feed/reply-count S "root") 2) (feed-test "direct replies to r1" (feed/reply-count S "r1") 1) (feed-test "no replies to r3" (feed/reply-count S "r3") 0) (feed-test "replies objects to root" (map (fn (a) (get a :object)) (feed/items (feed/replies S "root"))) (list "r1" "r2")) ; ---------- thread closure ---------- (feed-test "thread objects root (transitive)" (feed/thread-objects S "root") (list "root" "r1" "r2" "r3")) (feed-test "thread root chronological" (map (fn (a) (get a :object)) (feed/items (feed/thread S "root"))) (list "root" "r1" "r2" "r3")) (feed-test "thread size root" (feed/thread-size S "root") 4) (feed-test "thread excludes unrelated x" (feed/-elem? "x" (map (fn (a) (get a :object)) (feed/items (feed/thread S "root")))) false) ; ---------- sub-thread ---------- (feed-test "thread from r1 (sub-tree)" (map (fn (a) (get a :object)) (feed/items (feed/thread S "r1"))) (list "r1" "r3")) (feed-test "thread size r1" (feed/thread-size S "r1") 2) (feed-test "leaf thread is itself" (feed/thread-size S "r3") 1) (feed-test "unrelated thread is itself" (feed/thread-size S "x") 1)