Comparing version 0.4.7 to 0.4.8
export interface SArray<T> { | ||
(): T[]; | ||
concat(...others: SArray<T>[]): SArray<T>; | ||
concat(...others: (() => T | T[])[]): SArray<T>; | ||
every(pred: (v: T) => boolean): () => boolean; | ||
@@ -17,3 +17,3 @@ filter(pred: (v: T) => boolean): SArray<T>; | ||
mapS<U>(fn: (v: T, m: U | undefined, i: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: (() => U)[], from: number[], to: number[]) => void): SSignalArray<U>; | ||
mapSample<U>(fn: (v: T) => U, exit?: (v: T, i: number) => void, move?: (from: number[], to: number[]) => void): SArray<U>; | ||
mapSample<U>(fn: (v: T, m: U | undefined, i: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: U[], from: number[], to: number[]) => void): SArray<U>; | ||
orderBy<U>(key: (v: T) => U): SArray<T>; | ||
@@ -36,7 +36,7 @@ } | ||
export declare function lift<T>(seq: () => T[]): SArray<T>; | ||
export declare function mapS<T, U>(seq: () => T[], enter: (v: T, m?: U | undefined, i?: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: (() => U)[], from: number[], to: number[]) => void): () => (() => U)[]; | ||
export declare function mapS<T, U>(seq: () => T[], enter: (v: T, m: U | undefined, i: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: (() => U)[], from: number[], to: number[]) => void): () => (() => U)[]; | ||
export declare function mapSample<T, U>(seq: () => T[], enter: (v: T, m: U | undefined, i: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: U[], from: number[], to: number[]) => void): () => U[]; | ||
export declare function forEach<T>(seq: () => T[], enter: (v: T, i: number) => void, exit?: (v: T, i: number) => void, move?: (from: number[], to: number[]) => void): () => T[]; | ||
export declare function combine<T>(seq: () => (() => T)[]): () => T[]; | ||
export declare function map<T, U>(seq: () => T[], enter: (v: T, m?: U | undefined, i?: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: U[], from: number[], to: number[]) => void): () => U[]; | ||
export declare function map<T, U>(seq: () => T[], enter: (v: T, m: U | undefined, i: number) => U, exit?: (v: T, m: U, i: number) => void, move?: (items: T[], mapped: U[], from: number[], to: number[]) => void): () => U[]; | ||
export declare function find<T>(seq: () => T[], pred: (v: T) => boolean): () => T | undefined; | ||
@@ -47,3 +47,3 @@ export declare function includes<T>(seq: () => T[], o: T): () => boolean; | ||
export declare function filter<T>(seq: () => T[], predicate: (v: T) => boolean): () => T[]; | ||
export declare function concat<T>(seq: () => T[], ...others: (() => T)[]): () => T[]; | ||
export declare function concat<T>(seq: () => T[], ...others: (() => T | T[])[]): () => T[]; | ||
export declare function reduce<T, U>(seq: () => T[], fn: (r: U, t: T, i: number, s: T[]) => U, seed: U | (() => U)): () => U; | ||
@@ -50,0 +50,0 @@ export declare function reduceRight<T, U>(seq: () => T[], fn: (r: U, t: T, i: number, s: T[]) => U, seed: U | (() => U)): () => U; |
@@ -185,3 +185,3 @@ // synchronous array signals for S.js | ||
return S.on(seq, function mapSample() { | ||
var new_items = seq(), new_len = new_items.length, temp, tempdisposers, from = null, to = null, i, j, k, item; | ||
var new_items = seq(), new_len = new_items.length, new_indices, item_indices, temp, tempdisposers, from = null, to = null, i, j, start, end, new_end, item; | ||
// fast path for empty arrays | ||
@@ -209,5 +209,5 @@ if (new_len === 0) { | ||
else if (len === 0) { | ||
for (i = 0; i < new_len; i++) { | ||
item = items[i] = new_items[i]; | ||
mapped[i] = S.root(mapper); | ||
for (j = 0; j < new_len; j++) { | ||
items[j] = new_items[j]; | ||
mapped[j] = S.root(mapper); | ||
} | ||
@@ -217,2 +217,3 @@ len = new_len; | ||
else { | ||
new_indices = new Map(); | ||
temp = new Array(new_len); | ||
@@ -222,31 +223,55 @@ tempdisposers = new Array(new_len); | ||
from = [], to = []; | ||
// skip common prefix and suffix | ||
for (start = 0, end = Math.min(len, new_len); start < end && items[start] === new_items[start]; start++) | ||
; | ||
for (end = len - 1, new_end = new_len - 1; end >= 0 && new_end >= 0 && items[end] === new_items[new_end]; end--, new_end--) { | ||
temp[new_end] = mapped[end]; | ||
tempdisposers[new_end] = disposers[end]; | ||
} | ||
// 0) prepare a map of all indices in new_items, scanning backwards so we can pop them off in natural order | ||
for (j = new_end; j >= start; j--) { | ||
item = new_items[j]; | ||
item_indices = new_indices.get(item); | ||
if (item_indices === undefined) { | ||
new_indices.set(item, [j]); | ||
} | ||
else { | ||
item_indices.push(j); | ||
} | ||
} | ||
// 1) step through all old items and see if they can be found in the new set; if so, save them in a temp array and mark them moved; if not, exit them | ||
NEXT: for (i = 0, k = 0; i < len; i++) { | ||
for (i = start; i <= end; i++) { | ||
item = items[i]; | ||
for (j = 0; j < new_len; j++, k = (k + 1) % new_len) { | ||
if (item === new_items[k] && !temp.hasOwnProperty(k.toString())) { | ||
temp[k] = mapped[i]; | ||
tempdisposers[k] = disposers[i]; | ||
if (move && i !== k) { | ||
from.push(i); | ||
to.push(k); | ||
} | ||
k = (k + 1) % new_len; | ||
continue NEXT; | ||
item_indices = new_indices.get(item); | ||
if (item_indices !== undefined && item_indices.length > 0) { | ||
j = item_indices.pop(); | ||
temp[j] = mapped[i]; | ||
tempdisposers[j] = disposers[i]; | ||
if (move && i !== j) { | ||
from.push(i); | ||
to.push(j); | ||
} | ||
} | ||
if (exit) | ||
exit(item, mapped[i], i); | ||
disposers[i](); | ||
else { | ||
if (exit) | ||
exit(item, mapped[i], i); | ||
disposers[i](); | ||
} | ||
} | ||
if (move && from.length) | ||
if (move && (from.length !== 0 || end !== len - 1)) { | ||
end++, new_end++; | ||
while (end < len) { | ||
from.push(end++); | ||
to.push(new_end++); | ||
} | ||
move(items, mapped, from, to); | ||
} | ||
// 2) set all the new values, pulling from the temp array if copied, otherwise entering the new value | ||
for (i = 0; i < new_len; i++) { | ||
if (temp.hasOwnProperty(i.toString())) { | ||
mapped[i] = temp[i]; | ||
disposers[i] = tempdisposers[i]; | ||
for (j = start; j < new_len; j++) { | ||
if (temp.hasOwnProperty(j)) { | ||
mapped[j] = temp[j]; | ||
disposers[j] = tempdisposers[j]; | ||
} | ||
else { | ||
mapped[i] = S.root(mapper); | ||
mapped[j] = S.root(mapper); | ||
} | ||
@@ -261,4 +286,4 @@ } | ||
function mapper(disposer) { | ||
disposers[i] = disposer; | ||
return enter(new_items[i], mapped[i], i); | ||
disposers[j] = disposer; | ||
return enter(new_items[j], mapped[j], j); | ||
} | ||
@@ -265,0 +290,0 @@ }); |
81
index.js
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('s-js')) : | ||
typeof define === 'function' && define.amd ? define(['exports', 's-js'], factory) : | ||
(factory((global.SArray = global.SArray || {}),global.S)); | ||
(factory((global.SArray = {}),global.S)); | ||
}(this, (function (exports,S) { 'use strict'; | ||
S = 'default' in S ? S['default'] : S; | ||
S = S && S.hasOwnProperty('default') ? S['default'] : S; | ||
@@ -192,3 +192,3 @@ // synchronous array signals for S.js | ||
return S.on(seq, function mapSample() { | ||
var new_items = seq(), new_len = new_items.length, temp, tempdisposers, from = null, to = null, i, j, k, item; | ||
var new_items = seq(), new_len = new_items.length, new_indices, item_indices, temp, tempdisposers, from = null, to = null, i, j, start, end, new_end, item; | ||
// fast path for empty arrays | ||
@@ -216,5 +216,5 @@ if (new_len === 0) { | ||
else if (len === 0) { | ||
for (i = 0; i < new_len; i++) { | ||
item = items[i] = new_items[i]; | ||
mapped[i] = S.root(mapper); | ||
for (j = 0; j < new_len; j++) { | ||
items[j] = new_items[j]; | ||
mapped[j] = S.root(mapper); | ||
} | ||
@@ -224,2 +224,3 @@ len = new_len; | ||
else { | ||
new_indices = new Map(); | ||
temp = new Array(new_len); | ||
@@ -229,31 +230,55 @@ tempdisposers = new Array(new_len); | ||
from = [], to = []; | ||
// skip common prefix and suffix | ||
for (start = 0, end = Math.min(len, new_len); start < end && items[start] === new_items[start]; start++) | ||
; | ||
for (end = len - 1, new_end = new_len - 1; end >= 0 && new_end >= 0 && items[end] === new_items[new_end]; end--, new_end--) { | ||
temp[new_end] = mapped[end]; | ||
tempdisposers[new_end] = disposers[end]; | ||
} | ||
// 0) prepare a map of all indices in new_items, scanning backwards so we can pop them off in natural order | ||
for (j = new_end; j >= start; j--) { | ||
item = new_items[j]; | ||
item_indices = new_indices.get(item); | ||
if (item_indices === undefined) { | ||
new_indices.set(item, [j]); | ||
} | ||
else { | ||
item_indices.push(j); | ||
} | ||
} | ||
// 1) step through all old items and see if they can be found in the new set; if so, save them in a temp array and mark them moved; if not, exit them | ||
NEXT: for (i = 0, k = 0; i < len; i++) { | ||
for (i = start; i <= end; i++) { | ||
item = items[i]; | ||
for (j = 0; j < new_len; j++, k = (k + 1) % new_len) { | ||
if (item === new_items[k] && !temp.hasOwnProperty(k.toString())) { | ||
temp[k] = mapped[i]; | ||
tempdisposers[k] = disposers[i]; | ||
if (move && i !== k) { | ||
from.push(i); | ||
to.push(k); | ||
} | ||
k = (k + 1) % new_len; | ||
continue NEXT; | ||
item_indices = new_indices.get(item); | ||
if (item_indices !== undefined && item_indices.length > 0) { | ||
j = item_indices.pop(); | ||
temp[j] = mapped[i]; | ||
tempdisposers[j] = disposers[i]; | ||
if (move && i !== j) { | ||
from.push(i); | ||
to.push(j); | ||
} | ||
} | ||
if (exit) | ||
exit(item, mapped[i], i); | ||
disposers[i](); | ||
else { | ||
if (exit) | ||
exit(item, mapped[i], i); | ||
disposers[i](); | ||
} | ||
} | ||
if (move && from.length) | ||
if (move && (from.length !== 0 || end !== len - 1)) { | ||
end++, new_end++; | ||
while (end < len) { | ||
from.push(end++); | ||
to.push(new_end++); | ||
} | ||
move(items, mapped, from, to); | ||
} | ||
// 2) set all the new values, pulling from the temp array if copied, otherwise entering the new value | ||
for (i = 0; i < new_len; i++) { | ||
if (temp.hasOwnProperty(i.toString())) { | ||
mapped[i] = temp[i]; | ||
disposers[i] = tempdisposers[i]; | ||
for (j = start; j < new_len; j++) { | ||
if (temp.hasOwnProperty(j)) { | ||
mapped[j] = temp[j]; | ||
disposers[j] = tempdisposers[j]; | ||
} | ||
else { | ||
mapped[i] = S.root(mapper); | ||
mapped[j] = S.root(mapper); | ||
} | ||
@@ -268,4 +293,4 @@ } | ||
function mapper(disposer) { | ||
disposers[i] = disposer; | ||
return enter(new_items[i], mapped[i], i); | ||
disposers[j] = disposer; | ||
return enter(new_items[j], mapped[j], j); | ||
} | ||
@@ -272,0 +297,0 @@ }); |
113
index.ts
@@ -7,3 +7,3 @@ // synchronous array signals for S.js | ||
concat(...others : SArray<T>[]) : SArray<T>; | ||
concat(...others : (() => T | T[])[]) : SArray<T>; | ||
every(pred : (v : T) => boolean) : () => boolean; | ||
@@ -23,3 +23,3 @@ filter(pred : (v : T) => boolean) : SArray<T>; | ||
mapS<U>(fn : (v : T, m : U | undefined, i : number) => U, exit? : (v : T, m : U, i : number) => void, move? : (items : T[], mapped : (() => U)[], from : number[], to : number[]) => void) : SSignalArray<U>; | ||
mapSample<U>(fn : (v : T) => U, exit? : (v : T, i : number) => void, move? : (from : number[], to : number[]) => void) : SArray<U>; | ||
mapSample<U>(fn : (v : T, m : U | undefined, i : number) => U, exit? : (v : T, m : U, i : number) => void, move? : (items : T[], mapped : U[], from : number[], to : number[]) => void) : SArray<U>; | ||
orderBy<U>(key : (v : T) => U) : SArray<T>; | ||
@@ -44,2 +44,20 @@ } | ||
// inline ES6 Map type definition, as we want Typescript to target ES5, but with Map | ||
interface Map<K, V> { | ||
clear(): void; | ||
delete(key: K): boolean; | ||
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void; | ||
get(key: K): V | undefined; | ||
has(key: K): boolean; | ||
set(key: K, value: V): this; | ||
readonly size: number; | ||
} | ||
interface MapConstructor { | ||
new (): Map<any, any>; | ||
new <K, V>(entries?: [K, V][]): Map<K, V>; | ||
readonly prototype: Map<any, any>; | ||
} | ||
declare var Map: MapConstructor; | ||
export default function SArray<T>(values : T[]) : SDataArray<T> { | ||
@@ -195,3 +213,3 @@ if (!Array.isArray(values)) | ||
seq : () => T[], | ||
enter : (v : T, m? : U | undefined, i? : number) => U, | ||
enter : (v : T, m : U | undefined, i : number) => U, | ||
exit? : (v : T, m : U, i : number) => void, | ||
@@ -268,7 +286,7 @@ move? : (items : T[], mapped : (() => U)[], from : number[], to : number[]) => void | ||
this : () => T[], | ||
enter : (v : T, m? : U | undefined, i? : number) => U, | ||
enter : (v : T, m : U | undefined, i : number) => U, | ||
exit? : (v : T, m : U, i : number) => void, | ||
move? : (items : T[], mapped : (() => U)[], from : number[], to : number[]) => void | ||
) { | ||
var r = lift(mapS(this, enter, exit, move)) as any as SSignalArray<T>; | ||
var r = lift(mapS(this, enter, exit, move)) as SSignalArray<U>; | ||
r.combine = chainCombine; | ||
@@ -294,2 +312,4 @@ return r; | ||
new_len = new_items.length, | ||
new_indices : Map<T, number[]>, | ||
item_indices : number[] | undefined, | ||
temp : U[], | ||
@@ -301,3 +321,5 @@ tempdisposers : (() => void)[], | ||
j : number, | ||
k : number, | ||
start : number, | ||
end : number, | ||
new_end : number, | ||
item : T; | ||
@@ -325,8 +347,9 @@ | ||
} else if (len === 0) { | ||
for (i = 0; i < new_len; i++) { | ||
item = items[i] = new_items[i]; | ||
mapped[i] = S.root(mapper); | ||
for (j = 0; j < new_len; j++) { | ||
items[j] = new_items[j]; | ||
mapped[j] = S.root(mapper); | ||
} | ||
len = new_len; | ||
} else { | ||
new_indices = new Map<T, number[]>(); | ||
temp = new Array(new_len); | ||
@@ -336,28 +359,54 @@ tempdisposers = new Array(new_len); | ||
// skip common prefix and suffix | ||
for (start = 0, end = Math.min(len, new_len); start < end && items[start] === new_items[start]; start++); | ||
for (end = len - 1, new_end = new_len - 1; end >= 0 && new_end >= 0 && items[end] === new_items[new_end]; end--, new_end--) { | ||
temp[new_end] = mapped[end]; | ||
tempdisposers[new_end] = disposers[end]; | ||
} | ||
// 0) prepare a map of all indices in new_items, scanning backwards so we can pop them off in natural order | ||
for (j = new_end; j >= start; j--) { | ||
item = new_items[j]; | ||
item_indices = new_indices.get(item); | ||
if (item_indices === undefined) { | ||
new_indices.set(item, [j]); | ||
} else { | ||
item_indices.push(j); | ||
} | ||
} | ||
// 1) step through all old items and see if they can be found in the new set; if so, save them in a temp array and mark them moved; if not, exit them | ||
NEXT: | ||
for (i = 0, k = 0; i < len; i++) { | ||
for (i = start; i <= end; i++) { | ||
item = items[i]; | ||
for (j = 0; j < new_len; j++, k = (k + 1) % new_len) { | ||
if (item === new_items[k] && !temp.hasOwnProperty(k.toString())) { | ||
temp[k] = mapped[i]; | ||
tempdisposers[k] = disposers[i]; | ||
if (move && i !== k) { from.push(i); to.push(k); } | ||
k = (k + 1) % new_len; | ||
continue NEXT; | ||
item_indices = new_indices.get(item); | ||
if (item_indices !== undefined && item_indices.length > 0) { | ||
j = item_indices.pop()!; | ||
temp[j] = mapped[i]; | ||
tempdisposers[j] = disposers[i]; | ||
if (move && i !== j) { | ||
from.push(i); | ||
to.push(j); | ||
} | ||
} else { | ||
if (exit) exit(item, mapped[i], i); | ||
disposers[i](); | ||
} | ||
if (exit) exit(item, mapped[i], i); | ||
disposers[i](); | ||
} | ||
if (move && from.length) move(items, mapped, from, to); | ||
if (move && (from.length !== 0 || end !== len - 1)) { | ||
end++, new_end++; | ||
while (end < len) { | ||
from.push(end++); | ||
to.push(new_end++); | ||
} | ||
move(items, mapped, from, to); | ||
} | ||
// 2) set all the new values, pulling from the temp array if copied, otherwise entering the new value | ||
for (i = 0; i < new_len; i++) { | ||
if (temp.hasOwnProperty(i.toString())) { | ||
mapped[i] = temp[i]; | ||
disposers[i] = tempdisposers[i]; | ||
for (j = start; j < new_len; j++) { | ||
if (temp.hasOwnProperty(j as any)) { | ||
mapped[j] = temp[j]; | ||
disposers[j] = tempdisposers[j]; | ||
} else { | ||
mapped[i] = S.root(mapper); | ||
mapped[j] = S.root(mapper); | ||
} | ||
@@ -376,4 +425,4 @@ } | ||
function mapper(disposer : () => void) { | ||
disposers[i] = disposer; | ||
return enter(new_items[i], mapped[i], i); | ||
disposers[j] = disposer; | ||
return enter(new_items[j], mapped[j], j); | ||
} | ||
@@ -470,3 +519,3 @@ }); | ||
seq : () => T[], | ||
enter : (v : T, m? : U | undefined, i? : number) => U, | ||
enter : (v : T, m : U | undefined, i : number) => U, | ||
exit? : (v : T, m : U, i : number) => void, | ||
@@ -481,3 +530,3 @@ move? : (items : T[], mapped : U[], from : number[], to : number[]) => void | ||
this : () => T[], | ||
enter : (v : T, m? : U | undefined, i? : number) => U, | ||
enter : (v : T, m : U | undefined, i : number) => U, | ||
exit? : (v : T, m : U, i : number) => void, | ||
@@ -577,3 +626,3 @@ move? : (items : T[], mapped : U[], from : number[], to : number[]) => void | ||
export function concat<T>(seq : () => T[], ...others : (() => T)[]) { | ||
export function concat<T>(seq : () => T[], ...others : (() => T | T[])[]) { | ||
return S(function concat() { | ||
@@ -588,3 +637,3 @@ var s = seq(); | ||
function chainConcat<T>(this : () => T[], ...others : (() => T)[]) { | ||
function chainConcat<T>(this : () => T[], ...others : (() => T | T[])[]) { | ||
return lift(concat(this, ...others)); | ||
@@ -591,0 +640,0 @@ } |
{ | ||
"name": "s-array", | ||
"version": "0.4.7", | ||
"version": "0.4.8", | ||
"description": "Array library for S.js", | ||
@@ -8,4 +8,4 @@ "main": "index.js", | ||
"types": "es/index.d.ts", | ||
"dependencies": { | ||
"s-js": "^0.4.2" | ||
"peerDependencies": { | ||
"s-js": "^0.4.7" | ||
}, | ||
@@ -15,6 +15,6 @@ "devDependencies": { | ||
"karma": "^1.7.0", | ||
"karma-chrome-launcher": "^2.1.1", | ||
"karma-jasmine": "^1.1.0", | ||
"karma-chrome-launcher": "^2.1.1", | ||
"rollup": "^0.41.6", | ||
"typescript": "^2.3.2" | ||
"typescript": "^2.6.1" | ||
}, | ||
@@ -21,0 +21,0 @@ "scripts": { |
export default { | ||
entry: 'es/index.js', | ||
dest: 'index.js', | ||
format: 'umd', | ||
moduleName: 'SArray', | ||
exports: 'named', | ||
input: 'es/index.js', | ||
output: { | ||
file: 'index.js', | ||
format: 'umd', | ||
exports: 'named' | ||
}, | ||
name: 'SArray', | ||
external: ['s-js'], | ||
globals: { 's-js': "S"} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
82682
2313
- Removeds-js@^0.4.2