Double End Queue in Clojure

Is there a double-ended queue in Clojure? My impression of Clojure is PersistentQueuesingle (am I mistaken?). I need to remove (that is, "Pop") and "look" at the data from either end of the queue. The explanation of what I mean by the dual version of the queue is https://en.wikipedia.org/wiki/Double-ended_queue .

I see that Java has a double queue, but I'm not sure how to instantiate a queue object in Clojure. Tried to create a new queue with:

(java.util.Dequeue.) 

Gives an error:

No matching ctor was found for the java.util.Queue interface.

+4
source share
2 answers

Is there a double-ended queue in Clojure?

AFAIK no.

Clojure PersistentQueue ( ?).

conj peek/pop .

, Java , , Clojure.

java.util.Queue, interface. subinterface java.util.Deque :

, , ArrayDeque :

(def deque (java.util.ArrayDeque. [1 2 3]))
;;=> 'user/deque

(.pollFirst deque)
;;=> 1

, , interop , deque-clojure, Clojure.

+6

, clojure :

(defn deque 
  ([]
   '[()()])
  ([& elems]
   [elems '()]))

(defn push-front [deque elem]
  (let [[head tail] deque]
    [(cons elem head) tail]))

(defn push-back [deque elem]
  (let [[head tail] deque]
    [head (cons elem tail)]))

(defn pop-front [deque]
  (let [[head tail] deque]
    (if (empty? head)
      [(-> tail reverse rest) head]
      [(rest head) tail])))

(defn pop-back [deque]
  (let [[head tail] deque]
    (if (empty? tail)
      [tail (-> head reverse rest)]
      [head (rest tail)])))

(defn peek-front [deque]
  (let [[head tail] deque]
    (if (empty? head)
      (-> tail reverse first)
      (first head))))

(defn peek-back [deque]
  (let [[head tail] deque]
    (if (empty? tail)
      (-> head reverse first)
      (first tail))))


;; usage example:

user> (let [dq (deque )]
        (-> dq 
            (push-front :a)
            (push-front :b)
            (peek-back)))


:a
user> (let [dq (deque )]
        (-> dq 
            (push-front :a)
            (push-front :b)
            (pop-back)))


[() (:b)]

user> (let [dq (deque )]
    (-> dq 
        (push-back :a)
        (push-back :b)
        (peek-back)))
:b
+1
source

Source: https://habr.com/ru/post/1666168/


All Articles