(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)