cons

added
1.0

ns
clojure.core

type
function

(cons x seq)

Returns a new seq where x is the first element and seq is
the rest.

                ;; prepend 1 to a list
(cons 1 '(2 3 4 5 6))
;;=> (1 2 3 4 5 6)

;; notice that the first item is not expanded
(cons [1 2] [4 5 6])
;;=> ([1 2] 4 5 6)
            
                ;; may return results of different types but always a seq
(map (juxt identity type seq? list?)
     [(cons 1 nil)
      (cons 1 '())])
;; => ([(1) clojure.lang.PersistentList true true] 
;;     [(1) clojure.lang.Cons true false])

            
                ;; Cons new-element into nested structures "cons-in"

(def db {:users [{:name "Eduardo"}]})
(def new-element {:name "Eva"})

(assoc db :users (cons new-element (:users db)))
;; => {:users ({:name "Eva"} {:name "Eduardo"})}
            
                (defn zeros [] 
    (lazy-seq (cons 0 (zeros))))
;; "cons" does not realize second parameter, 
;;    opening the world for recursive functions that create lazy sequences

(first (zeroes))
0

(first (rest (zeroes)))
0

(first (rest (rest (zeroes))))
0

;; example stolen from youtuber : 
;;   https://youtu.be/iaph8m63HQw?list=PLAC43CFB134E85266