123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 'use strict';
- var inspect = require('object-inspect');
- var $TypeError = require('es-errors/type');
- var listGetNode = function (list, key, isDelete) {
-
- var prev = list;
-
- var curr;
-
- for (; (curr = prev.next) != null; prev = curr) {
- if (curr.key === key) {
- prev.next = curr.next;
- if (!isDelete) {
-
- curr.next = (list.next);
- list.next = curr;
- }
- return curr;
- }
- }
- };
- var listGet = function (objects, key) {
- if (!objects) {
- return void undefined;
- }
- var node = listGetNode(objects, key);
- return node && node.value;
- };
- var listSet = function (objects, key, value) {
- var node = listGetNode(objects, key);
- if (node) {
- node.value = value;
- } else {
-
- objects.next = ({
- key: key,
- next: objects.next,
- value: value
- });
- }
- };
- var listHas = function (objects, key) {
- if (!objects) {
- return false;
- }
- return !!listGetNode(objects, key);
- };
- var listDelete = function (objects, key) {
- if (objects) {
- return listGetNode(objects, key, true);
- }
- };
- module.exports = function getSideChannelList() {
-
-
-
- var $o;
-
- var channel = {
- assert: function (key) {
- if (!channel.has(key)) {
- throw new $TypeError('Side channel does not contain ' + inspect(key));
- }
- },
- 'delete': function (key) {
- var root = $o && $o.next;
- var deletedNode = listDelete($o, key);
- if (deletedNode && root && root === deletedNode) {
- $o = void undefined;
- }
- return !!deletedNode;
- },
- get: function (key) {
- return listGet($o, key);
- },
- has: function (key) {
- return listHas($o, key);
- },
- set: function (key, value) {
- if (!$o) {
-
- $o = {
- next: void undefined
- };
- }
-
- listSet( ($o), key, value);
- }
- };
-
- return channel;
- };
|