Skip to content

Instantly share code, notes, and snippets.

@cdaringe
Last active August 29, 2015 14:16
Show Gist options
  • Save cdaringe/6443c4108d88eca6c56a to your computer and use it in GitHub Desktop.
Save cdaringe/6443c4108d88eca6c56a to your computer and use it in GitHub Desktop.
requirebin sketch
var Collection = require('ampersand-collection');
var data = [
{
a: 'a',
b: 'auntie t\s'
}, {
a: 'b',
b: 'supreme'
}, {
a: 'c',
b: 'veggie'
}
];
var myCollection = new Collection();
myCollection.add(data);
console.log(myCollection.length);
myCollection.remove(data[0]); // nothing actually removed. no index is set. would need to manage a set of pointers
console.log(myCollection.length);
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var isFunction=require("amp-is-function");var isObject=require("amp-is-object");var nativeBind=Function.prototype.bind;var slice=Array.prototype.slice;var Ctor=function(){};module.exports=function bind(func,context){var args,bound;if(nativeBind&&func.bind===nativeBind)return nativeBind.apply(func,slice.call(arguments,1));if(!isFunction(func))throw new TypeError("Bind must be called on a function");args=slice.call(arguments,2);bound=function(){if(!(this instanceof bound))return func.apply(context,args.concat(slice.call(arguments)));Ctor.prototype=func.prototype;var self=new Ctor;Ctor.prototype=null;var result=func.apply(self,args.concat(slice.call(arguments)));if(isObject(result))return result;return self};return bound}},{"amp-is-function":2,"amp-is-object":3}],2:[function(require,module,exports){var toString=Object.prototype.toString;var func=function isFunction(obj){return toString.call(obj)==="[object Function]"};if(typeof/./!=="function"){func=function isFunction(obj){return typeof obj=="function"||false}}module.exports=func},{}],3:[function(require,module,exports){module.exports=function isObject(obj){var type=typeof obj;return!!obj&&(type==="function"||type==="object")}},{}],4:[function(require,module,exports){var objectExtend=require("extend-object");var extend=function(protoProps){var parent=this;var child;var args=[].slice.call(arguments);if(protoProps&&protoProps.hasOwnProperty("constructor")){child=protoProps.constructor}else{child=function(){return parent.apply(this,arguments)}}objectExtend(child,parent);var Surrogate=function(){this.constructor=child};Surrogate.prototype=parent.prototype;child.prototype=new Surrogate;if(protoProps){args.unshift(child.prototype);objectExtend.apply(null,args)}child.__super__=parent.prototype;return child};module.exports=extend},{"extend-object":7}],5:[function(require,module,exports){(function(){var root=this,breaker={},nativeForEach=Array.prototype.forEach,hasOwnProperty=Object.prototype.hasOwnProperty,slice=Array.prototype.slice,idCounter=0;function miniscore(){return{keys:Object.keys,uniqueId:function(prefix){var id=++idCounter+"";return prefix?prefix+id:id},has:function(obj,key){return hasOwnProperty.call(obj,key)},each:function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(iterator.call(context,obj[i],i,obj)===breaker)return}}else{for(var key in obj){if(this.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return}}}},once:function(func){var ran=false,memo;return function(){if(ran)return memo;ran=true;memo=func.apply(this,arguments);func=null;return memo}}}}var _=miniscore(),Events;Events={on:function(name,callback,context){if(!eventsApi(this,"on",name,[callback,context])||!callback)return this;this._events||(this._events={});var events=this._events[name]||(this._events[name]=[]);events.push({callback:callback,context:context,ctx:context||this});return this},once:function(name,callback,context){if(!eventsApi(this,"once",name,[callback,context])||!callback)return this;var self=this;var once=_.once(function(){self.off(name,once);callback.apply(this,arguments)});once._callback=callback;return this.on(name,once,context)},off:function(name,callback,context){var retain,ev,events,names,i,l,j,k;if(!this._events||!eventsApi(this,"off",name,[callback,context]))return this;if(!name&&!callback&&!context){this._events={};return this}names=name?[name]:_.keys(this._events);for(i=0,l=names.length;i<l;i++){name=names[i];if(events=this._events[name]){this._events[name]=retain=[];if(callback||context){for(j=0,k=events.length;j<k;j++){ev=events[j];if(callback&&callback!==ev.callback&&callback!==ev.callback._callback||context&&context!==ev.context){retain.push(ev)}}}if(!retain.length)delete this._events[name]}}return this},trigger:function(name){if(!this._events)return this;var args=slice.call(arguments,1);if(!eventsApi(this,"trigger",name,args))return this;var events=this._events[name];var allEvents=this._events.all;if(events)triggerEvents(events,args);if(allEvents)triggerEvents(allEvents,arguments);return this},stopListening:function(obj,name,callback){var listeners=this._listeners;if(!listeners)return this;var deleteListener=!name&&!callback;if(typeof name==="object")callback=this;if(obj)(listeners={})[obj._listenerId]=obj;for(var id in listeners){listeners[id].off(name,callback,this);if(deleteListener)delete this._listeners[id]}return this}};var eventSplitter=/\s+/;var eventsApi=function(obj,action,name,rest){if(!name)return true;if(typeof name==="object"){for(var key in name){obj[action].apply(obj,[key,name[key]].concat(rest))}return false}if(eventSplitter.test(name)){var names=name.split(eventSplitter);for(var i=0,l=names.length;i<l;i++){obj[action].apply(obj,[names[i]].concat(rest))}return false}return true};var triggerEvents=function(events,args){var ev,i=-1,l=events.length,a1=args[0],a2=args[1],a3=args[2];switch(args.length){case 0:while(++i<l)(ev=events[i]).callback.call(ev.ctx);return;case 1:while(++i<l)(ev=events[i]).callback.call(ev.ctx,a1);return;case 2:while(++i<l)(ev=events[i]).callback.call(ev.ctx,a1,a2);return;case 3:while(++i<l)(ev=events[i]).callback.call(ev.ctx,a1,a2,a3);return;default:while(++i<l)(ev=events[i]).callback.apply(ev.ctx,args)}};var listenMethods={listenTo:"on",listenToOnce:"once"};_.each(listenMethods,function(implementation,method){Events[method]=function(obj,name,callback){var listeners=this._listeners||(this._listeners={});var id=obj._listenerId||(obj._listenerId=_.uniqueId("l"));listeners[id]=obj;if(typeof name==="object")callback=this;obj[implementation](name,callback,this);return this}});Events.bind=Events.on;Events.unbind=Events.off;Events.mixin=function(proto){var exports=["on","once","off","trigger","stopListening","listenTo","listenToOnce","bind","unbind"];_.each(exports,function(name){proto[name]=this[name]},this);return proto};if(typeof define==="function"){define(function(){return Events})}else if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=Events}exports.BackboneEvents=Events}else{root.BackboneEvents=Events}})(this)},{}],6:[function(require,module,exports){module.exports=require("./backbone-events-standalone")},{"./backbone-events-standalone":5}],7:[function(require,module,exports){var arr=[];var each=arr.forEach;var slice=arr.slice;module.exports=function(obj){each.call(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj}},{}],8:[function(require,module,exports){var isArray=Array.isArray;var str=Object.prototype.toString;module.exports=isArray||function(val){return!!val&&"[object Array]"==str.call(val)}},{}],"ampersand-collection":[function(require,module,exports){var BackboneEvents=require("backbone-events-standalone");var classExtend=require("ampersand-class-extend");var isArray=require("is-array");var bind=require("amp-bind");var extend=require("extend-object");var slice=[].slice;function Collection(models,options){options||(options={});if(options.model)this.model=options.model;if(options.comparator)this.comparator=options.comparator;if(options.parent)this.parent=options.parent;if(!this.mainIndex){var idAttribute=this.model&&this.model.prototype&&this.model.prototype.idAttribute;this.mainIndex=idAttribute||"id"}this._reset();this.initialize.apply(this,arguments);if(models)this.reset(models,extend({silent:true},options))}extend(Collection.prototype,BackboneEvents,{initialize:function(){},indexes:[],isModel:function(model){return this.model&&model instanceof this.model},add:function(models,options){return this.set(models,extend({merge:false,add:true,remove:false},options))},parse:function(res,options){return res},serialize:function(){return this.map(function(model){if(model.serialize){return model.serialize()}else{var out={};extend(out,model);delete out.collection;return out}})},toJSON:function(){return this.serialize()},set:function(models,options){options=extend({add:true,remove:true,merge:true},options);if(options.parse)models=this.parse(models,options);var singular=!isArray(models);models=singular?models?[models]:[]:models.slice();var id,model,attrs,existing,sort,i,length;var at=options.at;var sortable=this.comparator&&at==null&&options.sort!==false;var sortAttr="string"===typeof this.comparator?this.comparator:null;var toAdd=[],toRemove=[],modelMap={};var add=options.add,merge=options.merge,remove=options.remove;var order=!sortable&&add&&remove?[]:false;var targetProto=this.model&&this.model.prototype||Object.prototype;for(i=0,length=models.length;i<length;i++){attrs=models[i]||{};if(this.isModel(attrs)){id=model=attrs}else if(targetProto.generateId){id=targetProto.generateId(attrs)}else{id=attrs[targetProto.idAttribute||this.mainIndex]}if(existing=this.get(id)){if(remove)modelMap[existing.cid||existing[this.mainIndex]]=true;if(merge){attrs=attrs===model?model.attributes:attrs;if(options.parse)attrs=existing.parse(attrs,options);if(existing.set){existing.set(attrs,options);if(sortable&&!sort&&existing.hasChanged(sortAttr))sort=true}else{extend(existing,attrs)}}models[i]=existing}else if(add){model=models[i]=this._prepareModel(attrs,options);if(!model)continue;toAdd.push(model);this._addReference(model,options)}model=existing||model;if(!model)continue;if(order&&(model.isNew&&model.isNew()||!model[this.mainIndex]||!modelMap[model.cid||model[this.mainIndex]]))order.push(model);modelMap[model[this.mainIndex]]=true}if(remove){for(i=0,length=this.length;i<length;i++){model=this.models[i];if(!modelMap[model.cid||model[this.mainIndex]])toRemove.push(model)}if(toRemove.length)this.remove(toRemove,options)}if(toAdd.length||order&&order.length){if(sortable)sort=true;if(at!=null){for(i=0,length=toAdd.length;i<length;i++){this.models.splice(at+i,0,toAdd[i])}}else{var orderedModels=order||toAdd;for(i=0,length=orderedModels.length;i<length;i++){this.models.push(orderedModels[i])}}}if(sort)this.sort({silent:true});if(!options.silent){for(i=0,length=toAdd.length;i<length;i++){model=toAdd[i];if(model.trigger){model.trigger("add",model,this,options)}else{this.trigger("add",model,this,options)}}if(sort||order&&order.length)this.trigger("sort",this,options)}return singular?models[0]:models},get:function(query,indexName){if(!query)return;var index=this._indexes[indexName||this.mainIndex];return index[query]||index[query[this.mainIndex]]||this._indexes.cid[query]||this._indexes.cid[query.cid]},at:function(index){return this.models[index]},remove:function(models,options){var singular=!isArray(models);var i,length,model,index;models=singular?[models]:slice.call(models);options||(options={});for(i=0,length=models.length;i<length;i++){model=models[i]=this.get(models[i]);if(!model)continue;this._deIndex(model);index=this.models.indexOf(model);this.models.splice(index,1);if(!options.silent){options.index=index;if(model.trigger){model.trigger("remove",model,this,options)}else{this.trigger("remove",model,this,options)}}this._removeReference(model,options)}return singular?models[0]:models},reset:function(models,options){options||(options={});for(var i=0,length=this.models.length;i<length;i++){this._removeReference(this.models[i],options)}options.previousModels=this.models;this._reset();models=this.add(models,extend({silent:true},options));if(!options.silent)this.trigger("reset",this,options);return models},sort:function(options){var self=this;if(!this.comparator)throw new Error("Cannot sort a set without a comparator");options||(options={});if(typeof this.comparator==="string"){this.models.sort(function(left,right){if(left.get){left=left.get(self.comparator);right=right.get(self.comparator)}else{left=left[self.comparator];right=right[self.comparator]}if(left>right||left===void 0)return 1;if(left<right||right===void 0)return-1;return 0})}else if(this.comparator.length===1){this.models.sort(function(left,right){left=self.comparator(left);right=self.comparator(right);if(left>right||left===void 0)return 1;if(left<right||right===void 0)return-1;return 0})}else{this.models.sort(bind(this.comparator,this))}if(!options.silent)this.trigger("sort",this,options);return this},_reset:function(){var list=this.indexes||[];var i=0;list.push(this.mainIndex);list.push("cid");var l=list.length;this.models=[];this._indexes={};for(;i<l;i++){this._indexes[list[i]]={}}},_prepareModel:function(attrs,options){if(!this.model)return attrs;if(this.isModel(attrs)){if(!attrs.collection)attrs.collection=this;return attrs}else{options=options?extend({},options):{};options.collection=this;var model=new this.model(attrs,options);if(!model.validationError)return model;this.trigger("invalid",this,model.validationError,options);return false}},_deIndex:function(model){for(var name in this._indexes){delete this._indexes[name][model[name]||model.get&&model.get(name)]}},_index:function(model){for(var name in this._indexes){var indexVal=model[name]||model.get&&model.get(name);if(indexVal)this._indexes[name][indexVal]=model}},_addReference:function(model,options){this._index(model);if(!model.collection)model.collection=this;if(model.on)model.on("all",this._onModelEvent,this)},_removeReference:function(model,options){if(this===model.collection)delete model.collection;this._deIndex(model);if(model.off)model.off("all",this._onModelEvent,this)},_onModelEvent:function(event,model,collection,options){if((event==="add"||event==="remove")&&collection!==this)return;if(event==="destroy")this.remove(model,options);if(model&&event==="change:"+this.mainIndex){this._deIndex(model);this._index(model)}this.trigger.apply(this,arguments)}});Object.defineProperties(Collection.prototype,{length:{get:function(){return this.models.length}},isCollection:{value:true}});var arrayMethods=["indexOf","lastIndexOf","every","some","forEach","map","filter","reduce","reduceRight"];arrayMethods.forEach(function(method){Collection.prototype[method]=function(){return this.models[method].apply(this.models,arguments)}});Collection.prototype.each=Collection.prototype.forEach;Collection.extend=classExtend;module.exports=Collection},{"amp-bind":1,"ampersand-class-extend":4,"backbone-events-standalone":6,"extend-object":7,"is-array":8}]},{},[]);var Collection=require("ampersand-collection");var data=[{a:"a",b:"auntie ts"},{a:"b",b:"supreme"},{a:"c",b:"veggie"}];var myCollection=new Collection;myCollection.add(data);console.log(myCollection.length);myCollection.remove(data[0]);console.log(myCollection.length);
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"ampersand-collection": "1.4.1"
}
}
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; }
body, html { height: 100%; width: 100%; }</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment