(ns mini-program-cljs.datalog
  (:require [datascript.core :as d]))

(defn recursive-rule
  []
  (let [res (d/q '[:find  ?u1 ?u2
                   :in    $ %
                   :where (follows ?u1 ?u2) ]
              [[1 :follows 2]
               [2 :follows 3]
               [3 :follows 4] ]
              '[[(follows ?e1 ?e2)
                 [?e1 :follows ?e2]]
                [(follows ?e1 ?e2)
                 [?e1 :follows ?t]
                 (follows ?t ?e2)]])]
    (clj->js res)))

(defn get-nav-path
  [^js tree-navs-list match-stri]
  (try
    (let [get-path-list
          (fn [tree-navs-list]
            (->>
              (js->clj tree-navs-list)
              (flatten)
              (map (fn [item] [(get item "content")
                               (get item "deep")]))))
          ,
          filter-data-index
          (fn [match-stri path-list]
            (keep-indexed
              (fn [index data]
                (if (= (first data) match-stri)
                  [index data]))
              path-list))
          ,
          take-path
          (fn [c-pros path-list]
            (take (first (first c-pros)) path-list))
          ,
          split-path
          (fn [deep path-list2]
            (first
              (split-with
                (complement #(= deep (last %)))
                path-list2)))]
      (let [path-list (get-path-list tree-navs-list)
            ;;
            pros (first (filter-data-index match-stri path-list))
            deep (last (last pros))
            path-list2 (take-path
                         (filter-data-index match-stri path-list)
                         path-list)]
        (prn "目标节点:" pros "path-list2=====" path-list2)
        (clj->js
          (first
            (split-with
              (complement #(= deep (last %)))
              path-list2)))))
    (catch :default e
      (prn "get-nav-path: " e)
      [])))
