Published
Edited
Oct 23, 2018
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
class Eyes extends Tool {
constructor(settings, toolkit, created = new Date().toISOString()) {
super(settings, toolkit);

// Load toolbelt Profile
console.log('here');
this.profile({
package: ['v0.3.0', '@potofcoffee2go/01-data-managment-toolbox'],
declare: ['timestamp','created'],
methods: ['addPeekFn(getFn, setFn)','removePeekFn(getFn, setFn)'],
resolve: ['data']
});

this._timestamp = settings._timestamp || settings.timestamp || created;
this._created = settings._created || settings.created || created;

// List of get and set peeker functions that peek at and possibly modify data
this._peekGetFnList = [];
this._peekSetFnList = [];
}

// Bypass setter processing of **this.toolkit.data**!
// which would cause max stack overflow (**this.toolkit.data** calls here!!)
// So updates toolkit data (toolkit._data) directly
set data(value) {
let setData = value;
this._peekSetFnList.forEach(fn => {setData = fn(setData, this.toolkit)});
this.toolkit._data = setData;
this._timestamp = new Date().toISOString();
if (this.toolkit.evnt) {this.toolkit.evnt.logData(`Eyes|data`, setData, this._timestamp)}
this.resolve('data');
}

get data() {
let getData = this.toolkit._data;
this._peekGetFnList.forEach(fn => {getData = fn(getData, this.toolkit)});
return getData;
}

addPeekFn(getFn, setFn) {
if (getFn) {this._peekGetFnList.unshift(getFn)}
if (setFn) {this._peekSetFnList.push(setFn)}
}

removePeekFn(getFn, setFn) {
//if (getFn) {this._peekGetFnList.unshift(getFn)}
//if (setFn) {this._peekSetFnList.push(setFn)}
}
}
Insert cell
Insert cell
class Edge extends Tool {
constructor(settings, toolkit) {
super(settings, toolkit);

this.profile({
package: ['v0.3.0', '@potofcoffee2go/01-data-managment-toolbox'],
declare: [
'slug', // Lookup name
'scope', // Set or category
'uid', // unique identifier
'prev', // Previous toolkitfundamental
'next', // Next toolkit
'parents', // Parents tookits
'siblings', // Sibling tookits
'children'], // Children tookits
methods: [],
resolve: []
});

this._uid = settings._uid || settings.uid || util.uniqueId();
this._slug = settings._slug || settings.slug || util.uniqueId();
this._scope = settings._scope || settings.scope || undefined;
this.toolkit.addToolkit(this);
}
}
Insert cell
Insert cell
class Feed extends Tool{
constructor(settings, toolkit) {
super(settings, toolkit);

this.profile({
package: ['v0.3.0', '@potofcoffee2go/01-data-managment-toolbox'],
declare: [
'overwrite', // automatically overwrite toolkit's data
'href', // Url of feed
'data'], // data if 'overwrite' is false
methods: ['async fetch(href, opts)'],
resolve: ['fetch']
});

// Only resolve href when the href actually changes
// todo: fix this when removing button pressed
this.override('href', null, (href) => {
if (href !== this.href) {
this._href = href;
}
});

this.override('overwrite',null, (value) => {
if ((value && this.overwrite) && (!value && !this.overwrite)) {
return this._overwrite = value; // no change
}
if (value && !this.overwrite) {
this.toolkit.data = this.data; // move tool data to toolkit
this.data = undefined;
return this._overwrite = value;
}
if (!value && this.overwrite) {
this.data = this.toolkit.data; // move toolkit data to tool
this.toolkit.data = undefined;
return this._overwrite = value;
}
});

this._overwrite = settings.__overwrite || settings._overwrite || true;
this._href = settings._href || settings.href || undefined;
}

// Returns the JSON data from Url in .href
async fetch(href, opts) {
// Both requested and stored href are undefined - do nothing
if (!href && !this.href) {return undefined};
if (href && href !== this.href) {this.href = href}
if (this.href) {
const response = await util.getJson(this.href, opts);

if (this.overwrite) {this.toolkit.data = response}
else {this.data = response}

this.resolve('fetch');
}
}

}
Insert cell
Insert cell
class Evnt extends Tool {
constructor(settings, toolkit) {
super(settings, toolkit);
this.profile({
package: ['v0.3.0',
`Emit - records toolkit data updates`],
declare: ['queue', 'maxlen'],
methods: [],
resolve: ['enqueue']
});

// Use the History tool to mess around with these
this._queue = [];
this._maxlen = 10;
this._seq = 0;
this._emitter = new EventTarget();

if (settings._emit) {Object.assign(this, settings._emit)}

}
get queue() {return this._queue}
get length() {return this._queue.length}
get emitter() {return this._emitter}
get emit() {return this._emit}
set length(value) {this._maxlen = value}

get emitter() {return this._emitter}

_emit(resolved, data, timestamp) {
// If is our own resolve - just return
if (resolved !== 'Evnt|enqueue') {
var event = new CustomEvent(resolved, {detail: new Enqueue(resolved, data, timestamp)});
this.emitter.dispatchEvent(event);
}
}

on(resolveText, fn) {
console.log('hit aggain@@')
this.emitter.addEventListener(resolveText, fn);
//this.emitter.on(resolveText, fn);
}

// This function called by Eyes tool
logData(resolved, data, timestamp) {
// If maxlen = 0 then skip logging and emitting
if (this._maxlen) {
let enqueue = new Enqueue (resolved, data, timestamp);
// push onto the queue
this.queue.unshift(enqueue);
// limit to maxlen entries
if (this.queue.length > this._maxlen) {this.queue.length = this._maxlen}
this.resolve('enqueue');
}
}
}

Insert cell
class EventTarget1 {
constructor(){
this.listeners = {};
}

addEventListener(type, callback) {
if (!(type in this.listeners)) {this.listeners[type] = []}
this.listeners[type].push(callback);
}

removeEventListener(type, callback) {
if (!(type in this.listeners)) {
return;
}
var stack = this.listeners[type];
for (var i = 0, l = stack.length; i < l; i++) {
if (stack[i] === callback) {
stack.splice(i, 1);
return;
}
}
}

dispatchEvent(event) {
if (!(event.type in this.listeners)) {
return true;
}
var stack = this.listeners[event.type].slice();
for (var i = 0, l = stack.length; i < l; i++) {
stack[i].call(this, event);
}
return !event.defaultPrevented;
}
}
Insert cell
class Enqueue {
constructor(resolved, data, timestamp) {
this._resolved = resolved;
this._data = data;
this._timestamp = timestamp;
}
get data() {return this._data}
get timestamp() {return this._timestamp}
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more