anchor.diff:  (require '[bytebuff.core :as buf])
   
   ;; Indexed composition
  -(def my-spec1 (buf/spec (buf/int32) (buf/bool)))
  +(def my-spec1 (buf/spec buf/int32 buf/bool))
   
   ;; The same spec but using associative composition
  -(def my-spec2 (buf/spec :field1 (buf/int32)
  -                        :field2 (buf/bool)))
  +(def my-spec2 (buf/spec :field1 buf/int32
  +                        :field2 buf/bool))
   ----
   
   You can check that the spec size (in bytes) and number of types internally is the same
  
positive.code: .Example how obtain a size of specific type spec
  [source, clojure]
  ----
  (buf/size (buf/int16))
  ;; => 2
  
  (buf/size (buf/string*))
  ;; => IllegalArgumentException No implementation of method: :size of protocol: #'bytebuf.proto/IStaticSize found for class: bytebuf.spec.string$string_STAR_$reify__1804  clojure.core/-cache-protocol-fn (core_deftype.clj:555)
  ----
  
  === Define own type spec
  
negative.code: are easy understand, the size of the spec can be know in any time. But in some circumstances
  we want store arbitrary length types.
  
  Arbitrary lenght strings is a clear example:
  
  .Example writing arbitrary length string into buffer
  [source, clojure]
  ----
  (buf/write! buffer "hello world" buf/string*)
  ;; => 15
  ----
  
  