UNPKG

dojox

Version:

Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.

196 lines (193 loc) 5 kB
define(["dojo/_base/kernel", "dojo/_base/array", "./_base"], function(dojo, darray, dxc){ dxc.SortedList=function(/*object?*/ dictionary){ // summary: // creates a collection that acts like a dictionary but is also internally sorted. // Note that the act of adding any elements forces an internal resort, making this object potentially slow. var _this=this; var items={}; var q=[]; var sorter=function(a,b){ if (a.key > b.key) return 1; if (a.key < b.key) return -1; return 0; }; var build=function(){ q=[]; var e=_this.getIterator(); while (!e.atEnd()){ q.push(e.get()); } q.sort(sorter); }; var testObject={}; this.count=q.length; this.add=function(/*string*/ k,/*object*/ v){ // summary: // add the passed value to the dictionary at location k if (!items[k]) { items[k]=new dxc.DictionaryEntry(k,v); this.count=q.push(items[k]); q.sort(sorter); } }; this.clear=function(){ // summary: // clear the internal collections items={}; q=[]; this.count=q.length; }; this.clone=function(){ // summary: // create a clone of this sorted list return new dxc.SortedList(this); // dojox.collections.SortedList }; this.contains=this.containsKey=function(/*string*/ k){ // summary: // Check to see if the list has a location k if(testObject[k]){ return false; // bool } return (items[k]!=null); // bool }; this.containsValue=function(/*object*/ o){ // summary: // Check to see if this list contains the passed object var e=this.getIterator(); while (!e.atEnd()){ var item=e.get(); if(item.value==o){ return true; // bool } } return false; // bool }; this.copyTo=function(/*array*/ arr, /*int*/ i){ // summary: // copy the contents of the list into array arr at index i var e=this.getIterator(); var idx=i; while(!e.atEnd()){ arr.splice(idx,0,e.get()); idx++; } }; this.entry=function(/*string*/ k){ // summary: // return the object at location k return items[k]; // dojox.collections.DictionaryEntry }; this.forEach=function(/*function*/ fn, /*object?*/ scope){ // summary: // functional iterator, following the mozilla spec. dojo.forEach(q, fn, scope); }; this.getByIndex=function(/*int*/ i){ // summary: // return the item at index i return q[i].valueOf(); // object }; this.getIterator=function(){ // summary: // get an iterator for this object return new dxc.DictionaryIterator(items); // dojox.collections.DictionaryIterator }; this.getKey=function(/*int*/ i){ // summary: // return the key of the item at index i return q[i].key; }; this.getKeyList=function(){ // summary: // return an array of the keys set in this list var arr=[]; var e=this.getIterator(); while (!e.atEnd()){ arr.push(e.get().key); } return arr; // array }; this.getValueList=function(){ // summary: // return an array of values in this list var arr=[]; var e=this.getIterator(); while (!e.atEnd()){ arr.push(e.get().value); } return arr; // array }; this.indexOfKey=function(/*string*/ k){ // summary: // return the index of the passed key. for (var i=0; i<q.length; i++){ if (q[i].key==k){ return i; // int } } return -1; // int }; this.indexOfValue=function(/*object*/ o){ // summary: // return the first index of object o for (var i=0; i<q.length; i++){ if (q[i].value==o){ return i; // int } } return -1; // int }; this.item=function(/*string*/ k){ // summary: // return the value of the object at location k. if(k in items && !testObject[k]){ return items[k].valueOf(); // object } return undefined; // object }; this.remove=function(/*string*/ k){ // summary: // remove the item at location k and rebuild the internal collections. delete items[k]; build(); this.count=q.length; }; this.removeAt=function(/*int*/ i){ // summary: // remove the item at index i, and rebuild the internal collections. delete items[q[i].key]; build(); this.count=q.length; }; this.replace=function(/*string*/ k, /*object*/ v){ // summary: // Replace an existing item if it's there, and add a new one if not. if (!items[k]){ // we're adding a new object, return false this.add(k,v); return false; // bool }else{ // we're replacing an object, return true items[k]=new dxc.DictionaryEntry(k,v); build(); return true; // bool } }; this.setByIndex=function(/*int*/ i, /*object*/ o){ // summary: // set an item by index items[q[i].key].value=o; build(); this.count=q.length; }; if (dictionary){ var e=dictionary.getIterator(); while (!e.atEnd()){ var item=e.get(); q[q.length]=items[item.key]=new dxc.DictionaryEntry(item.key,item.value); } q.sort(sorter); } }; return dxc.SortedList; });