Back

Buffer (clj)

(source)

protocol

Examples

typedclojure/typedclojure
    End users should use typed.lib.clojure.core.async, which all types here
    are qualified under."}
  typed.ann.clojure.core.async
  (:require [typed.clojure :refer [ann ann-datatype defalias ann-protocol] :as t]
            [typed.lib.clojure.core.async :as-alias ta]
            [clojure.core.async.impl.protocols :as-alias impl])
  (:import (java.util.concurrent.locks Lock)))

(ann-protocol [[w :variance :contravariant]
               [r :variance :covariant]]
               clojure.core.async.impl.protocols/Buffer
               full? [(impl/Buffer w r) :-> t/Any]
               remove! [(impl/Buffer w r) :-> nil]
               add!* [(impl/Buffer w r) w :-> (impl/Buffer w r)])

(ann-protocol clojure.core.async.impl.protocols/UnblockingBuffer)

(defalias 
  ^{:forms '[(Buffer2 t t)]}
  ta/Buffer2
  "A buffer of that can write type w and read type t."
  (t/TFn [[w :variance :contravariant]
          [r :variance :covariant]]
         (t/I (impl/Buffer w r)
              clojure.lang.Counted)))

(defalias 
  ^{:forms '[(Buffer t)]}
  ta/Buffer
  "A buffer of type x."
  (t/TFn [[x :variance :invariant]]
         (ta/Buffer2 x x)))

(defalias 
  ^{:forms '[(UnblockingBuffer2 t t)]}
  ta/UnblockingBuffer2
  "An unblocking buffer that can write type w and read type t."
  (t/TFn [[w :variance :contravariant]
          [r :variance :covariant]]
         (t/I (ta/Buffer2 w r)
              impl/UnblockingBuffer)))

(defalias 
  ^{:forms '[(UnblockingBuffer t)]}
  ta/UnblockingBuffer
  "An unblocking buffer of type x."
  (t/TFn [[x :variance :invariant]]
         (ta/UnblockingBuffer2 x x)))

(ann ^:no-check clojure.core.async/buffer (t/All [t] [t/Int :-> (ta/Buffer t)]))
(ann ^:no-check clojure.core.async/dropping-buffer (t/All [t] [t/Int :-> (ta/Buffer t)]))
(ann ^:no-check clojure.core.async/sliding-buffer (t/All [t] [t/Int :-> (ta/Buffer t)]))

; TODO buffer must be supplied when xform is
(ann ^:no-check clojure.core.async/chan
     (t/All [p t]
            (t/IFn [:-> (ta/Chan2 p t)]
                   [; buf-or-n
                    (t/U (ta/Buffer2 p t) t/Int nil) :-> (ta/Chan2 p t)]
                   [; buf-or-n
                    (t/U (ta/Buffer2 p t) t/Int nil)
                    ; xform
                    (t/U nil (t/Transducer p t))
                    ; ex-handler
                    (t/U nil [Throwable :-> (t/U nil p)])
                    :?
                    :-> (ta/Chan2 p t)])))
walmartlabs/lacinia-pedestal
(ns com.walmartlabs.lacinia.pedestal.spec
  "Common specifications."
  {:added "0.10.0"}
  (:require
    com.walmartlabs.lacinia.schema                          ; for CompiledSchema
    [clojure.core.async.impl.protocols :refer [Buffer]]
    io.pedestal.interceptor                                 ; for Interceptor
    [clojure.spec.alpha :as s])
  (:import
    (com.walmartlabs.lacinia.schema CompiledSchema)
    (io.pedestal.interceptor Interceptor)))

(s/def ::buffer-or-n (s/or :buffer #(satisfies? Buffer %)
                           :n pos-int?))