(ns spec-depedent-types.naive
  (:require [clojure.spec.alpha :as s]))

(defn size-matches? [coll]
  (= (count coll)
     (inc (first coll))))

(s/def ::dependent-spec (s/and sequential?
                               #(integer? (first %))
                               size-matches?))

(s/valid? ::dependent-spec [5 1 2 3 4 5])
;; => true
(s/valid? ::dependent-spec [3 "a" "b" "c"])
;; => true
(s/conform ::dependent-spec [3 "a" "b" "c"])
;; => [3 "a" "b" "c"]

(s/valid? ::dependent-spec [4 "singleElement"])
;; => false
(s/explain ::dependent-spec [4 "singleElement"])
;; => val: [4 "singleElement"] fails spec: :spec-depedent-types.naive/dependent-spec predicate: size-matches?

(s/valid? ::dependent-spec [0])
;; => true


(defn do-something [coll]
  (when (not (s/valid? ::dependent-spec coll))
    (throw (RuntimeException.)))
  (let [size (first coll)
        [_ & elements] coll]
    (println "Size: " size ", elements: " elements)))

(do-something [3 "a" "b" "c"])
;; => Size:  3 , elements:  (a b c)