-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFSM.js
38 lines (37 loc) · 894 Bytes
/
FSM.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function FSM(pattern, source) {
let n = 0;
let states = pattern.split('');
const statesMap = []
const result = [];
states.forEach((item, index) => {
eval((function () {
return `statesMap.push(function (c) {
++n;
${
item === pattern[pattern.length - 1] ?
`
if (c === '${pattern[pattern.length - 1]}') {
console.log(n)
result.push(n)
}
${
((pattern.length - 1) % 1 === 0 &&
pattern.substring(0, (pattern.length - 1) / 2) === pattern.substring((pattern.length - 1) / 2, pattern.length - 1)) ?
`return statesMap[${index - 1}]` :
''
}
` :
`if (c === '${item}') {
return statesMap[${index + 1}]
}`
}
return statesMap[0]
})`
})());
});
let state = statesMap[0];
for (let i = 0; i < source.length; i++) {
state = state(source[i])
}
return result;
}