(ns clojurach.core
  (:require [clojure.test :as test :refer [deftest testing is are]]))
 
(defn grep-n [n pred coll]
  (->> coll
       (map-indexed (fn [i x] (clojure.lang.MapEntry. i x)))
       (partition (-> n (* 2) inc) 1)
       (filter #(-> % (nth n) val pred))
       (apply concat)
       distinct
       (map val)))
      
(deftest grep-n-test
	(is (= '(0) (grep-n 1 #{0} (range 1))))
	(is (= '(0 1 2) (grep-n 2 #{2} (range 3)))))
 
;; hack :)

(defn grep-n-hack [n pred coll]
  (->> (concat (repeat n ::nil) coll (repeat n ::nil))
       (map-indexed (fn [i x] (clojure.lang.MapEntry. i x)))
       (partition (-> n (* 2) inc) 1)
       (filter #(some-> % (nth n) val pred))
       (apply concat)
       distinct
       (map val)
       (remove #{::nil})))

(deftest grep-n-hack-test
	(is (= '(0) (grep-n-hack 1 #{0} (range 1))))
	(is (= '(0 1 2) (grep-n-hack 2 #{2} (range 3)))))

(test/successful? (test/run-tests))