;; lib/minikanren/tests/take-drop.sx — Peano-indexed prefix/suffix.

(define
  mk-nat
  (fn (n) (if (= n 0) :z (list :s (mk-nat (- n 1))))))

;; --- tako ---

(mk-test
  "tako-zero"
  (run*
    q
    (tako (mk-nat 0) (list 1 2 3) q))
  (list (list)))

(mk-test
  "tako-two"
  (run*
    q
    (tako
      (mk-nat 2)
      (list 1 2 3 4 5)
      q))
  (list (list 1 2)))

(mk-test
  "tako-all"
  (run*
    q
    (tako (mk-nat 3) (list 1 2 3) q))
  (list (list 1 2 3)))

(mk-test
  "tako-too-many"
  (run*
    q
    (tako (mk-nat 5) (list 1 2 3) q))
  (list))

;; --- dropo ---

(mk-test
  "dropo-zero"
  (run*
    q
    (dropo (mk-nat 0) (list 1 2 3) q))
  (list (list 1 2 3)))

(mk-test
  "dropo-two"
  (run*
    q
    (dropo
      (mk-nat 2)
      (list 1 2 3 4 5)
      q))
  (list (list 3 4 5)))

(mk-test
  "dropo-all"
  (run*
    q
    (dropo (mk-nat 3) (list 1 2 3) q))
  (list (list)))

(mk-test
  "dropo-too-many"
  (run*
    q
    (dropo (mk-nat 5) (list 1 2 3) q))
  (list))

;; --- take + drop round-trip ---

(mk-test
  "tako-dropo-roundtrip"
  (run*
    q
    (fresh
      (p s)
      (tako
        (mk-nat 2)
        (list 1 2 3 4 5)
        p)
      (dropo
        (mk-nat 2)
        (list 1 2 3 4 5)
        s)
      (appendo p s q)))
  (list (list 1 2 3 4 5)))

(mk-tests-run!)
