mirror of https://github.com/codefeathers/window
Muthu Kumar
7 years ago
7 changed files with 92 additions and 47 deletions
@ -1,5 +1,5 @@ |
|||
'use strict'; |
|||
|
|||
const Slider = require('./structures/slider'); |
|||
const Slider = require('./lib/slider'); |
|||
|
|||
module.exports = Slider; |
|||
|
@ -0,0 +1,14 @@ |
|||
const returnError = (code, message) => { |
|||
return { |
|||
err: message, |
|||
code |
|||
} |
|||
} |
|||
|
|||
const errors = { |
|||
'WIN_TOO_LARGE_HOST': returnError('WIN_TOO_LARGE_HOST', 'Window size is larger than host object'), |
|||
'WIN_TOO_LARGE_GUEST': returnError('WIN_TOO_LARGE_GUEST', 'Window size is larger than guest object'), |
|||
'COULD_NOT_SLIDE': returnError('COULD_NOT_SLIDE', 'Could not slide into position for given window') |
|||
}; |
|||
|
|||
module.exports = errors; |
@ -0,0 +1,52 @@ |
|||
const isEq = require('@codefeathers/iseq'); |
|||
const Fuse = require('@codefeathers/fuse'); |
|||
|
|||
const errors = require('./errorsHelper'); |
|||
|
|||
const wrap = (f, ...x) => (...y) => f(...x, ...y); |
|||
|
|||
const converter = ( |
|||
hostPosition, |
|||
guestPosition, |
|||
matchLength |
|||
) => ({ |
|||
hostPosition, |
|||
guestPosition, |
|||
matchLength |
|||
}); |
|||
|
|||
const slideNext = (host, window, hostPos, windowPos, len = 1) => { |
|||
const newHostPos = hostPos + 1; |
|||
const newWindowPos = windowPos + 1; |
|||
if (isEq(window[newWindowPos], host[newHostPos])) |
|||
return slideNext(host, window, newHostPos, newWindowPos, len + 1); |
|||
return (len); |
|||
}; |
|||
|
|||
const startSliding = (k, host, guest, window, windowPos) => { |
|||
|
|||
const firstMatch = host.findIndex(wrap(isEq, window[0])); |
|||
|
|||
// If first item returns a match, then continue to slideNext()
|
|||
const len = firstMatch ? slideNext(host, guest, firstMatch, windowPos) : undefined; |
|||
if (len && len > 1) return converter(firstMatch, windowPos, len); |
|||
|
|||
const nextWindowPos = windowPos + 1; |
|||
const newWindow = guest.slice(nextWindowPos, nextWindowPos + k); |
|||
if (newWindow.length === k) return startSliding(newWindow, nextWindowPos); |
|||
|
|||
return errors.COULD_NOT_SLIDE; |
|||
|
|||
}; |
|||
|
|||
const slide = (k, host, guest) => { |
|||
|
|||
if (k > host.length) return errors.WIN_TOO_LARGE_HOST; |
|||
if (k > guest.length) return errors.WIN_TOO_LARGE_GUEST; |
|||
|
|||
// Create a new window and start sliding
|
|||
const window = guest.slice(0, k); |
|||
return startSliding(k, host, guest, window, 0); |
|||
} |
|||
|
|||
module.exports = slide; |
@ -0,0 +1,17 @@ |
|||
'use strict'; |
|||
|
|||
const slideHelper = require('./slideHelper'); |
|||
|
|||
class Slider { |
|||
constructor (options) { |
|||
this.windowSize = options.size; |
|||
this.prefer = options.prefer; |
|||
this.accepting = options.accepting; |
|||
} |
|||
|
|||
slide (host, guest) { |
|||
return slideHelper(this.windowSize, host, guest); |
|||
} |
|||
}; |
|||
|
|||
module.exports = Slider; |
@ -1,46 +0,0 @@ |
|||
'use strict'; |
|||
|
|||
const isEq = require('@codefeathers/iseq'); |
|||
|
|||
const wrap = (f, ...x) => (...y) => f(...x, ...y); |
|||
|
|||
class Slider { |
|||
constructor (options) { |
|||
this.windowSize = options.size; |
|||
this.prefer = options.prefer; |
|||
this.accepting = options.accepting; |
|||
} |
|||
|
|||
slide (host, guest) { |
|||
|
|||
const k = this.windowSize; |
|||
|
|||
const get = { |
|||
val: 0, |
|||
next: () => ++get.val, |
|||
} |
|||
|
|||
const startSliding = (window, i) => { |
|||
|
|||
const firstMatch = host.findIndex(wrap(isEq, window[0])); |
|||
if(firstMatch !== -1) { |
|||
get.val = firstMatch; |
|||
if(window.every((item, j) => { |
|||
if(j === 0) return true; |
|||
return isEq(item, host[get.next()]); |
|||
})) return [ firstMatch, i ]; |
|||
} |
|||
|
|||
const nextI = i + 1; |
|||
const newWindow = guest.slice(nextI, nextI + k); |
|||
if(newWindow.length === k) return startSliding(newWindow, nextI); |
|||
|
|||
return [ -1, -1 ]; |
|||
|
|||
}; |
|||
const window = guest.slice(0, k); |
|||
return startSliding(window, 0); |
|||
} |
|||
}; |
|||
|
|||
module.exports = Slider; |
@ -0,0 +1,7 @@ |
|||
const Slider = require('.'); |
|||
|
|||
const a = [ 0, 1, 2, 3, 4, 5 ]; |
|||
const b = [ 2, 3, 4 ]; |
|||
|
|||
const w = new Slider({ size: 3 }); |
|||
console.log(w.slide(a, b)); |
Loading…
Reference in new issue