;; lib/minikanren/tests/partitiono.sx — partition list by predicate.

(mk-test
  "partitiono-empty"
  (run*
    q
    (fresh
      (yes no)
      (partitiono (fn (x) (== x 1)) (list) yes no)
      (== q (list yes no))))
  (list (list (list) (list))))

(mk-test
  "partitiono-by-equality"
  (run*
    q
    (fresh
      (yes no)
      (partitiono
        (fn (x) (== x 2))
        (list 1 2 3 2 4)
        yes
        no)
      (== q (list yes no))))
  (list
    (list
      (list 2 2)
      (list 1 3 4))))

(mk-test
  "partitiono-by-numeric-pred"
  (run*
    q
    (fresh
      (yes no)
      (partitiono
        (fn (x) (lto-i x 5))
        (list 1 7 2 8 3)
        yes
        no)
      (== q (list yes no))))
  (list
    (list
      (list 1 2 3)
      (list 7 8))))

(mk-test
  "partitiono-all-yes"
  (run*
    q
    (fresh
      (yes no)
      (partitiono
        (fn (x) (lto-i x 100))
        (list 1 2 3)
        yes
        no)
      (== q (list yes no))))
  (list (list (list 1 2 3) (list))))

(mk-test
  "partitiono-all-no"
  (run*
    q
    (fresh
      (yes no)
      (partitiono
        (fn (x) (lto-i 100 x))
        (list 1 2 3)
        yes
        no)
      (== q (list yes no))))
  (list (list (list) (list 1 2 3))))

(mk-tests-run!)
