simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

lruQueue.js (1285B)


      1 // (c) 2018, Mariusz Nowak
      2 // SPDX-License-Identifier: ISC
      3 // Derived from https://github.com/medikoo/lru-queue
      4 export function lruQueue(limit) {
      5   var size = 0;
      6   var base = 1;
      7   var queue = Object.create(null);
      8   var map = Object.create(null);
      9   var index = 0;
     10 
     11   var del = function del(id) {
     12     var oldIndex = map[id];
     13     if (!oldIndex) return;
     14     delete queue[oldIndex];
     15     delete map[id];
     16     --size;
     17     if (base !== oldIndex) return;
     18 
     19     if (!size) {
     20       index = 0;
     21       base = 1;
     22       return;
     23     }
     24 
     25     while (!hasOwnProperty.call(queue, ++base)) {
     26       continue;
     27     }
     28   };
     29 
     30   limit = Math.abs(limit);
     31   return {
     32     hit: function hit(id) {
     33       var oldIndex = map[id];
     34       var nuIndex = ++index;
     35       queue[nuIndex] = id;
     36       map[id] = nuIndex;
     37 
     38       if (!oldIndex) {
     39         ++size;
     40         if (size <= limit) return undefined;
     41         id = queue[base];
     42         del(id);
     43         return id;
     44       }
     45 
     46       delete queue[oldIndex];
     47       if (base !== oldIndex) return undefined;
     48 
     49       while (!hasOwnProperty.call(queue, ++base)) {
     50         continue;
     51       }
     52 
     53       return undefined;
     54     },
     55     delete: del,
     56     clear: function clear() {
     57       size = index = 0;
     58       base = 1;
     59       queue = Object.create(null);
     60       map = Object.create(null);
     61     }
     62   };
     63 }
     64 ;