{"_id":"@dvermeir/cbuf","_rev":"5-58e378fc388b1dbd88f2d8164b74a2af","name":"@dvermeir/cbuf","description":"Efficient Circular FIFO Buffer Implementation.","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@dvermeir/cbuf","version":"0.1.0","description":"Efficient Circular FIFO Buffer Implementation.","main":"cbuf.es7","scripts":{"test":"make check"},"repository":{"type":"git","url":"git+https://github.com/age-bijkaart/cbuf.git"},"keywords":["FIFO","ring","buffer","circular","buffer","queue"],"author":{"name":"Dirk Vermeir","email":"dirk.vermeir.be@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/age-bijkaart/cbuf/issues"},"homepage":"https://github.com/age-bijkaart/cbuf#readme","gitHead":"8585cf8220c52bdc588645884b0f60a094cef943","_id":"@dvermeir/cbuf@0.1.0","_npmVersion":"5.5.1","_nodeVersion":"8.1.3","_npmUser":{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"},"dist":{"integrity":"sha512-mkqFeRAqC8yOJmJmSPrNedhBkMccxEHzu5lcBGp3iUj/bVwtLnqNUNSBDGTjbTkJvyVO3i0jNOR+o1KA6u3GEA==","shasum":"51e713d765e46835373c95f059d2053dd0467246","tarball":"https://registry.npmjs.org/@dvermeir/cbuf/-/cbuf-0.1.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGr6jbe4/719pXLj4W9fGVELGV5pwizopk9OBGS5Kn/sAiEAj9g5mB44DJ1qM9JMGxZJx0QImiuwKrv562Cjr/SV6bE="}]},"maintainers":[{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cbuf-0.1.0.tgz_1509538062928_0.06671927752904594"}},"0.1.1":{"name":"@dvermeir/cbuf","version":"0.1.1","description":"Efficient Circular FIFO Buffer Implementation.","main":"cbuf.js","scripts":{"test":"make check"},"repository":{"type":"git","url":"git+https://github.com/age-bijkaart/cbuf.git"},"keywords":["FIFO","ring","buffer","circular","buffer","queue"],"author":{"name":"Dirk Vermeir","email":"dirk.vermeir.be@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/age-bijkaart/cbuf/issues"},"homepage":"https://github.com/age-bijkaart/cbuf#readme","devDependencies":{"babel-cli":"^6.26.0","babel-eslint":"^8.0.1","babel-plugin-transform-runtime":"^6.23.0","babel-preset-es2015":"^6.24.1","babel-preset-es2017":"^6.24.1","babel-preset-stage-0":"^6.24.1","eslint":"^4.10.0"},"gitHead":"e1171a1c9179c752bcbe8356fbf82b06f15c95f5","_id":"@dvermeir/cbuf@0.1.1","_npmVersion":"5.5.1","_nodeVersion":"8.1.3","_npmUser":{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"},"dist":{"integrity":"sha512-+mr3gDsfe63Wr6HZYqZCncFGpXQAMKvgBdMYfxzhU7f/YHsx2yo3LIK3pltWu/hK4vRZUy+aYQ2fuZdtFOHWCQ==","shasum":"acc48d62914d9cd62afbdfb2dd9cdf1977c70d16","tarball":"https://registry.npmjs.org/@dvermeir/cbuf/-/cbuf-0.1.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG8gPXt0wQ45GJRL9u0LkL4ocnr4r2gSLqJkMeB/bxHkAiEA+JbB8+3blsBMxGfcUE+FX8zJBvJQ6aI1khYkifCvC+g="}]},"maintainers":[{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cbuf-0.1.1.tgz_1509562039127_0.32146555138751864"}},"0.1.2":{"name":"@dvermeir/cbuf","version":"0.1.2","description":"Efficient Circular FIFO Buffer Implementation.","main":"cbuf.js","scripts":{"test":"make check"},"repository":{"type":"git","url":"git+https://github.com/age-bijkaart/cbuf.git"},"keywords":["FIFO","ring","buffer","circular","buffer","queue"],"author":{"name":"Dirk Vermeir","email":"dirk.vermeir.be@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/age-bijkaart/cbuf/issues"},"homepage":"https://github.com/age-bijkaart/cbuf#readme","devDependencies":{"babel-cli":"^6.26.0","babel-eslint":"^8.0.1","babel-plugin-transform-runtime":"^6.23.0","babel-preset-es2015":"^6.24.1","babel-preset-es2017":"^6.24.1","babel-preset-stage-0":"^6.24.1","eslint":"^4.10.0"},"gitHead":"f995011f1335710e8e7711bdc1026f432ef4b436","_id":"@dvermeir/cbuf@0.1.2","_npmVersion":"5.5.1","_nodeVersion":"8.1.3","_npmUser":{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"},"dist":{"integrity":"sha512-gVN2sJARfS0BxNhHSFrNP7rNDx7vNkuPNhTi/6CxF2e1KSQcfg/A9u5Cm1hZ0uvFiJt690muMW1evQqbJhIV2g==","shasum":"e60b02a88143ae51f2ae5601b0918517c4458a86","tarball":"https://registry.npmjs.org/@dvermeir/cbuf/-/cbuf-0.1.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB79azZMnjNU4sUpWNOLUUuvdh0C4uth2vbTKdQ4qrsrAiBVKIxapNLy51BxBA2H6tax0N++qnglORUDW8RSh2TRyw=="}]},"maintainers":[{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cbuf-0.1.2.tgz_1509562168942_0.370670351665467"}},"0.1.3":{"name":"@dvermeir/cbuf","version":"0.1.3","description":"Efficient Circular FIFO Buffer Implementation.","main":"cbuf.js","scripts":{"test":"make check"},"repository":{"type":"git","url":"git+https://github.com/age-bijkaart/cbuf.git"},"keywords":["FIFO","ring","buffer","circular","buffer","queue"],"author":{"name":"Dirk Vermeir","email":"dirk.vermeir.be@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/age-bijkaart/cbuf/issues"},"homepage":"https://github.com/age-bijkaart/cbuf#readme","devDependencies":{"babel-cli":"^6.26.0","babel-eslint":"^8.0.1","babel-plugin-transform-runtime":"^6.23.0","babel-preset-es2015":"^6.24.1","babel-preset-es2017":"^6.24.1","babel-preset-stage-0":"^6.24.1","eslint":"^4.10.0"},"gitHead":"2a52d30a2231f91942a12ae0adc5b9c88ecc1067","_id":"@dvermeir/cbuf@0.1.3","_npmVersion":"5.5.1","_nodeVersion":"8.1.3","_npmUser":{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"},"dist":{"integrity":"sha512-BrnHZin8zafbSEQd9ouoHb/n1Etrtr+ZyWPerVnCpaoKaeHxar2E60GJQqrvifADzpWixCzK9mKe7GAIUNCjKw==","shasum":"9cdd5ba5b94a59e02ad011d6d1c86f8c19036107","tarball":"https://registry.npmjs.org/@dvermeir/cbuf/-/cbuf-0.1.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIELW8SlLxm6jfbzM6d3MWRvr6jRaZbtxjG/e7nl2dvkLAiEAy7II6vDyJ/uMGkFf0kvcalcAi63c62Nevcgut4wYEAI="}]},"maintainers":[{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cbuf-0.1.3.tgz_1509827694045_0.19052606262266636"}},"0.1.4":{"name":"@dvermeir/cbuf","version":"0.1.4","description":"Efficient Circular FIFO Buffer Implementation.","main":"cbuf.js","scripts":{"test":"make check"},"repository":{"type":"git","url":"git+https://github.com/age-bijkaart/cbuf.git"},"keywords":["FIFO","ring","buffer","circular","buffer","queue"],"author":{"name":"Dirk Vermeir","email":"dirk.vermeir.be@gmail.com"},"license":"MIT","bugs":{"url":"https://github.com/age-bijkaart/cbuf/issues"},"homepage":"https://github.com/age-bijkaart/cbuf#readme","devDependencies":{"babel-cli":"^6.26.0","babel-eslint":"^8.0.2","babel-plugin-transform-runtime":"^6.23.0","babel-preset-es2015":"^6.24.1","babel-preset-es2017":"^6.24.1","babel-preset-stage-0":"^6.24.1","eslint":"^4.10.0"},"dependencies":{"babel-runtime":"^6.26.0"},"gitHead":"a538048597eeafac8734803181c9a0624e39c102","_id":"@dvermeir/cbuf@0.1.4","_npmVersion":"5.5.1","_nodeVersion":"8.1.3","_npmUser":{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"},"dist":{"integrity":"sha512-8UeImswZsPeaD5QmqPzeGouaV64HEHhyt5nm/l0Wulzb+QMZfgc1mealqhq2dN+nKpk07dTklLSKllegebMIDA==","shasum":"58901f422225c69c482413941a6d5156757939da","tarball":"https://registry.npmjs.org/@dvermeir/cbuf/-/cbuf-0.1.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMVp9cTMN4ewvcbqzmstvGpYNxi1bkkaVz23euLltG+gIgCeYvRCeAM/uiWIAEJk+5lrbwnjtVvmrvLd5KFiwocwE="}]},"maintainers":[{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cbuf-0.1.4.tgz_1510162942031_0.049282659543678164"}}},"readme":"<a id=\"Top\" href=\"#Top\"/>\n\n# Circular Buffer Version 0.1.N\n\n\n1. [Overview](#Overview)\n2. [API Index](cbuf.md)\n3. [API Details](cbuf.md#module_CBUF)\n4. [CBUF test](cbuf-test.md)\n5. [NPM](https://www.npmjs.com/package/@dvermeir/cbuf)\n\n<a id=\"Overview\" href=\"#Top\">\n\n# The CBUF module\n\n</a>\n\nMotivation: a circular buffer is used to keep track of data chunks coming\nfrom a socket: the reader appends chunks at the back while a\nconsumer removes chunks from the front. Thus, this data structure can also be\nused to represent a [FIFO queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)).\n\nThere are several other circular buffer packages available on npm.\n\nThe reason for developing this module is that I wanted to write a simple\nmodule that\n* helps me learn a bit about javascript (I'm a novice)\n* is efficient\n* provides exactly the functionality that is needed: push and shift,\n  which have the same effect (FIFO) as the operations with the same name on\n  [Arrays]( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array).\n\n\n\nBeing a JS novice, I am reluctant to use 'classes' based on prototypical\ninheritance and with a strange semantics for `this`. This is why this\nimplementation only uses plain functions whose first \nargument is always (except for CBUF.create) the circular buffer \n'under consideration', i.e. 'this'.\n\nHere's a quick example of creating and using a circular buffer.\n## Example\n```javascript\n  import CBUF from '@dvermeir/cbuf';\n\n  let c = CBUF.create(10); // c will manage DATA array of size 10\n\n  // Equivalent would be `while CBUF.push(c, read_input()) ;`\n  // because `CBUF.push()` returns `true` iff the append succeeded.\n  while (! CBUF.full(c) ) // while c has some free space\n    CBUF.push(c, read_input()); // read a some data and append them as a 'chunk' to the queue/buffer \n\n  // Assert `CBUF.full(c)`, i.e. `c[CBUF.POP] === c[CBUF.DATA].length`\n\n  while (! CBUF.empty(c)) // while there is stuff to process\n    process(CBUF.shift(c)); // process the oldest chunk and remove it from the queue\n  // etc.\n```\n\n## Installation\n\nStandard: \n```bash\n  npm install --save @dvermeir/cbuf\n```\nThe module has no runtime dependencies.\n\n## API (informal)\n\nFor the 'formal' API, see the jsdoc2md output [here](cbuf.md).\n\nSince a circular buffer object might later be\nextended with extra functionality and properties, it is important to prevent\naccidental reuse and shadowing of property names. \nJavascript provides\n[Symbols](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) that are guaranteed to be unique. E.g. circular buffer objects have a property called\n\n```javascript\n  const DATA = Symbol('data');\n```\n\nIf, in a later extension, one wishes to again use a 'data' property, calling\n`Symbol('data')` again will yield a different Symbol. \n\n*It seems that one cannot use the dot notation when accessing properties named\nby symbols. Thus, instead of `cbuf.DATA`, one needs to write `cbuf[DATA]`, as\nwith computed property names.*\n\nThe following 3 `Symbol` property names for circular buffer objects are\nexported (`cbuf` is the name of a circular buffer object):\n\n- `POP`: `cbuf[POP]` is the population, i.e. the number of elements currently\n  in the buffer),\n- `DATA`: `cbuf[DATA]` is an\n  [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) containing `cbuf[DATA].length` available slots to \n  store elements in. Obviously,\n```javascript\n    0 <= cbuf[POP] <= cbuf[DATA].length\n```\n  must hold at all times.\n- `BEGIN`: `cbuf[BEGIN]` is the index in `cbuf[DATA]` where the first (oldest) \n  element in the circular buffer/FIFO queue lives, if the buffer is not empty.\n\n```javascript\n  0 <= cbuf[BEGIN] < cbuf[DATA].length\n\n  if (cbuf[POP] > 0)\n    cbuf[DATA][BEGIN] // is oldest element in buffer, `cbuf_shift` will return it\n```\n\nOne can think of the contents of a circular buffer as a sequence, with a first\nand last element, if not empty.\nIt may be that, in the circular buffer (`cbuf[DATA]`) array, the index of the\nlast element is smaller than the index of the first element.\nThis is illustrated in the example below where '`X`' means an element is\npresent at the index (of the circular buffer array) below while '-' means no \nelement is present.\n```javascript\n  cbuf[DATA][]:\n\n    X--XX\n    01234\n```\nThis represents a buffer of capacity 5. Its current contents is the sequence \n```javascript\n  cbuf[DATA][3], cbuf[DATA][4], cbuf[DATA][0]\n```\nThe other data members of the buffer are\n```javascript\n  cbuf[BEGIN] = 3; // index in cbuf[DATA][] of the first element of the sequence\n  cbuf[POP] = 3; // number of elements in the sequence\n  cbuf[DATA].length = 5; // maximal length of a representable sequence\n```\n\nHere is a javascript expression to transform a triple \n```javascript\n(start, size, max_size)\n```\nto the sequence of indices in a circular buffer of `max_size` capacity \ncontaining\nthe elements in the associated sequence.\n```javascript\nlet interval = \n  (start, size, max_size) => \n    Array.from(Array(start + size).keys())\n      .filter((el, i, _) => start <= i)\n      .map((el) => (el % max_size));\n```\nFor the example circular buffer `cbuf` above,\nthe corresponding interval becomes (we show the intermediate results\ncorresponding to the successive operations in the definition of `interval`\nthen becomes\n```javascript\n  interval(3, 3, 5) ->\n    (0, 1, 2, 3, 4, 5) // Array.from(Array(3 + 3).keys()\n    (3, 4, 5) // filter((el, i, _) => 3 <= i)\n    (3, 4, 0) // map((el) => (el % 5))\n```\nThe sequence represented by the a circular buffer `c`\nis then readily available as\n```javascript\nlet contents(c) =\n  (c) =>\n    interval(c[BEGIN], c[POP], cbuf[DATA].length).map((index)=>c[DATA](index))\n```\nIf for the example circular buffer above, \n```javascript\ncbuf[DATA] === [10, undefined, undefined, 13, 14]`:\n```\nthen the sequence it represents is `[13, 14, 10]`:\n```javascript\n  assert( array_eq( contents(cbuf), [13, 14, 10]) )\n```\n\nBased on the `contents` function it is easy to formulate an invariant function\nas well as pre- and post-conditions for the `push` and `shift` operations. See\n[code](cbuf-test.md#invariant).\n\nMore (and better) info on circular buffers can be found e.g. on\n[Wikipedia](https://en.wikipedia.org/wiki/Circular_buffer).\n\n\n### Import the package\n```javascript\n  import CBUF from '@dvermeir/cbuf'\n```\n\n### Make a new circular buffer:\nBelow we use `'und'` as a shorthand for `undefined`.\n```javascript\n  // create a new circular buffer with a capacity of 5\n  let cbuf = CBUF.create(5); \n\n  console.log('cbuf capacity = ', cbuf[CBUF.DATA].length); // 5\n  console.log('cbuf begin = ', cbuf[CBUF.BEGIN]); // 0\n  console.log('cbuf population = ', cbuf[CBUF.POP]); // 0\n  console.log('cbuf data = ', cbuf[CBUF.DATA]); // [und und und und und]\n```\n\nThe unique and obligatory parameter is the size of the buffer, i.e.\nthe maximum number of elements it can hold at any time.\nThis is also called the *capacity* (`cbuf[CBUF.DATA].length`) of the buffer.\n\nIt is also possible to clone a buffer:\n```javascript\n  new_buffer = CBUF.clone(buffer);\n```\n\n### Retrieve information on the sequence represented by the buffer\n\nThe sequence stored in a circular buffer is (note the half-open interval):\n\n```javascript\n  const data = cbuf[CBUF.DATA]\n  const max = data.length; \n  const begin = CBUF.BEGIN\n  const pop = cbuf[CBUF.POP]\n\n\n  [ data[begin] .. data[(begin + pop) % max]  [\n```\n\nThere are 2 special cases that can be tested using the Boolean functions\n`CBUF.empty` and `CBUF.full`:\n\n- an empty sequence is represented by a buffer where\n```javascript\nconst CBUF.empty = (cbuf) => (cbuf[CBUF.POP] === 0);\n```\n  returns true;\n- for a maximal sequence completely filling the buffer:\n```javascript\nconst CBUF.full = (cbuf) =>  ( cbuf[CBUF.POP] === cbuf[CBUF.DATA].length );\n```\nwill return true.\n\nRetrieving the first element of the sequence can be trivially done using\n\n```javascript\n  // first element in the buffer, if not empty. undefined otherwise.\n  cbuf[CBUF.DATA][CBUF.BEGIN];\n```\n\nTo retrieve the last element of the sequence:\n```javascript\n  // last element, or undefined if the sequence is empty\n  CBUF.last(cbuf) \n```\nThus, one could loop through the elements of the sequence like so:\n\n```javascript\n  const max = cbuf[CBUF.DATA].length);\n  let arr = [];\n  let p = 0;\n  while (p < cbuf[CBUF.POP])\n    arr.push(cbuf[CBUF.DATA][(cbuf[CBUF.BEGIN] + p++) % max]);\n```\n\nActually, there is an\n[iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators) defined on the circular buffer,\nand the above could be written as \n\n```javascript\n  let arr = [];\n  for (const z of CBUF.iterable(cbuf)) {\n    arr.push(z);\n```\n\nHere `for..of` is understood by the system because the\n[generator function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function%2A)  lives in `iterable[Symbol.iterator]`, a well known\n[symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator).\n\nSee the [source](cbuf.md). \n\n### Append an element to the sequence in the buffer.\n\n``` js\n  /* Boolean */ CBUF.push(cbuf, element)\n```\nThis will return `true` if the append succeeded, and `false` otherwise. In the\nlatter case, it must be that the circular buffer is full. Note that the\nfollowing always holds:\n\n```javascript\n  if (CBUF.push(cbuf, element))\n    assert(element === CBUF.last(cbuf));\n```\n\n### Remove an element from the front of the sequence in the buffer.\n\n``` js\n  // return oldest element or undefined if buffer empty\n  element = CBUF.shift(cbuf) \n```\nThis will delete the first element of the sequence and return it.\nIf the sequence was empty to start with, the function returns `undefined`.\n\nNote also that the place that `element` occupied in the buffer will be\nexplicitly set to `undefined`. \n\n### Incrementing an index in `cbuf[DATA]`\n\n```javascript\n  // return index of next position, the one after 'i', in the buffer\n  const cbuf_inc = (cbuf, i) => (i + 1) % cbuf[DATA].length;\n```\n\n### That's it\n\nThe whole [thing](cbuf.es7) takes 67 lines (excluding comments) and contains but 3 conditional statements (`if` or `?`). \n\nMore information can be found in the 'specify and test' file\n[`cbuf-doc.es7`](cbuf-test.md).\nThere the invariant defining a legal state of a circular buffer is defined as\nare the 'contracts' (pre- and postconditions) that must be respected by the\nupdate operations `CBUF.push` and `CBUF.shift`.\n\nThe build tool is the venerable [`make`](https://www.gnu.org/software/make/) \nprogram that can be used in the traditional way:\n```bash\n  make\n```\nwhich also does several incantations of `babel` to support 2017 syntax.\nIt translates\n`.es7` to `.js` files.\nAlso\n`make install` and `make check` (to do the tests) are supported, as are `make\nclean` and `make doc`.\n\nThe Makefile is actually very small:\n```make\n  include vars.mk\n  # Check 'vars.mk' for names of lists to which you may want to add\n  # some files e.g. bashscripts += myscript.sh\n  #\n  # Below are some standard ones\n  src = cbuf.es7\n  tst = cbuf-test.es7 assert-test.es7\n  #\n  # See 'rules.mk' to have an idea what goals are available.\n  # Here we define the first one which will thus be the default:\n  # 'make all' is the same as 'make'.\n  #\n  # If you want to know what will be done before\n  # actually doing it, do 'make -n'. E.g. 'make -n clean'.\n  all: install \n  # Another nonstandard rule that combines the 'check' (running test programs)\n  # with 'lint':\n  checkall: check lint\n  #\n  # A bunch of rules that explain how to make '.js' files from '.es7' files,\n  # process markdown files etc etc\n  include rules.mk\n```\ni.e., only 6 lines excluding comments. There's a good reason to separate\n`rules.mk` and `vars.mk`: I suspect future projects can simply copy them and\njust bother with another tiny `Makefile`.\n\n\n&copy; 2017 Dirk Vermeir\n\n","maintainers":[{"name":"dvermeir","email":"dirk.vermeir.be@gmail.com"}],"time":{"modified":"2022-04-05T06:10:08.617Z","created":"2017-11-01T12:07:44.031Z","0.1.0":"2017-11-01T12:07:44.031Z","0.1.1":"2017-11-01T18:47:20.255Z","0.1.2":"2017-11-01T18:49:30.117Z","0.1.3":"2017-11-04T20:34:55.187Z","0.1.4":"2017-11-08T17:42:22.340Z"},"homepage":"https://github.com/age-bijkaart/cbuf#readme","keywords":["FIFO","ring","buffer","circular","buffer","queue"],"repository":{"type":"git","url":"git+https://github.com/age-bijkaart/cbuf.git"},"author":{"name":"Dirk Vermeir","email":"dirk.vermeir.be@gmail.com"},"bugs":{"url":"https://github.com/age-bijkaart/cbuf/issues"},"license":"MIT","readmeFilename":"README.md"}