mirror of https://github.com/codefeathers/window
Muthu Kumar
7 years ago
commit
da430d570e
5 changed files with 112 additions and 0 deletions
@ -0,0 +1 @@ |
|||||
|
node_modules |
@ -0,0 +1,5 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const Slider = require('./structures/slider'); |
||||
|
|
||||
|
module.exports = Slider; |
@ -0,0 +1,29 @@ |
|||||
|
{ |
||||
|
"name": "@codefeathers/window", |
||||
|
"version": "0.0.1", |
||||
|
"description": "A sliding window algorithm to insert a new array into an existing one.", |
||||
|
"main": "index.js", |
||||
|
"scripts": { |
||||
|
"test": "echo \"Error: no test specified\" && exit 1" |
||||
|
}, |
||||
|
"repository": { |
||||
|
"type": "git", |
||||
|
"url": "git+https://github.com/codefeathers/sliding-window.git" |
||||
|
}, |
||||
|
"keywords": [ |
||||
|
"sliding-window", |
||||
|
"insertion", |
||||
|
"algorithm", |
||||
|
"array", |
||||
|
"javascript" |
||||
|
], |
||||
|
"author": "Muthu Kumar @MKRhere <https://mkr.pw>", |
||||
|
"license": "MIT", |
||||
|
"bugs": { |
||||
|
"url": "https://github.com/codefeathers/sliding-window/issues" |
||||
|
}, |
||||
|
"homepage": "https://github.com/codefeathers/sliding-window#readme", |
||||
|
"dependencies": { |
||||
|
"@codefeathers/iseq": "^1.1.0" |
||||
|
} |
||||
|
} |
@ -0,0 +1,41 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const isEq = require('@codefeathers/iseq/isEq'); |
||||
|
|
||||
|
const Window = require('./window'); |
||||
|
|
||||
|
const wrap = (f, ...x) => (...y) => f(...x, ...y); |
||||
|
|
||||
|
class Slider { |
||||
|
constructor (options) { |
||||
|
this.windowSize = options.window; |
||||
|
this.prefer = options.prefer; |
||||
|
this.accepting = options.accepting; |
||||
|
} |
||||
|
|
||||
|
slide (to, from) { |
||||
|
const k = this.windowSize; |
||||
|
const host = new Window(...to); |
||||
|
const guest = new Window(...from); |
||||
|
const recurse = (window, i) => { |
||||
|
let x, y, z; |
||||
|
x = host.findIndex(wrap(isEq, window[0])); |
||||
|
let switcher = true; |
||||
|
if(x !== -1) |
||||
|
for (let j = 1; j < window.length; j++) |
||||
|
if(host.findIndexAfter(x, wrap(isEq, window[j])) === -1) { |
||||
|
switcher = false; |
||||
|
break; |
||||
|
} |
||||
|
if(switcher) return [ x, i ]; |
||||
|
const newWindow = new Window(...guest.slice(++i, k)); |
||||
|
if(newWindow.length !== 0 && newWindow.length === k) return recurse(newWindow, i); |
||||
|
return [ -1, -1 ]; |
||||
|
}; |
||||
|
const window = new Window(...guest.slice(0, k)); |
||||
|
const index = recurse(window, 0); |
||||
|
return index; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
module.exports = Slider; |
@ -0,0 +1,36 @@ |
|||||
|
class Window extends Array { |
||||
|
|
||||
|
constructor (...args) { |
||||
|
if(args.length === 1) return args; |
||||
|
return super(...args); |
||||
|
} |
||||
|
|
||||
|
recurse (fn) { |
||||
|
let index = 0; |
||||
|
const call = (arr, acc = []) => { |
||||
|
if(arr[0]) { |
||||
|
const res = fn(index++, arr[0]); |
||||
|
return call(arr.slice(1), [ res, ...acc ]); |
||||
|
} |
||||
|
return acc; |
||||
|
}; |
||||
|
return call(this); |
||||
|
} |
||||
|
|
||||
|
findIndexAfter(index, predicate) { |
||||
|
const self = this; |
||||
|
let i = index + 1; |
||||
|
while(i < self.length) { |
||||
|
if(predicate(self[i])) return i; |
||||
|
i++; |
||||
|
} |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
empty () { |
||||
|
this.recurse(i => this.splice(i)); |
||||
|
return this; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
module.exports = Window; |
Loading…
Reference in new issue