-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
72 lines (60 loc) · 2.39 KB
/
index.js
File metadata and controls
72 lines (60 loc) · 2.39 KB
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
'use strict';
var hashGen = require("shorthash");
class ResponsePicker {
constructor(trackingObject) {
this.trackingObject = trackingObject;
}
pickResponse(prompts) {
if (!(prompts instanceof Array) || prompts.length < 1) {
throw new Error("Input must be an array with positive length");
}
if (prompts.length === 1) {
return prompts[0];
}
let promptHash = hashGen.unique(prompts.toString());
// Initialize data object for list of prompts.
if (this.trackingObject[promptHash] === undefined) {
let promptTrackingData = new Array(prompts.length).fill(0);
this.trackingObject[promptHash] = {
promptTrackingData: promptTrackingData,
lastPromptLocation: promptTrackingData,
};
}
let promptTrackingData = this.trackingObject[promptHash]["promptTrackingData"];
let lastPromptLocation = this.trackingObject[promptHash]["lastPromptLocation"];
let filterFromPrompt = undefined;
let prompt = undefined;
// Reset tracking data once all prompts have been used.
// Exclude the last prompt index so repeats will not happen.
if (promptTrackingData.indexOf(0) === -1) {
// Pick any element except the one that was picked last
prompt = getRandomPromptUsingFilter(prompts, lastPromptLocation);
filterFromPrompt = addPromptIndexToNewFilter(prompt, prompts);
promptTrackingData.fill(0);
promptTrackingData = unionFilters(promptTrackingData, filterFromPrompt);
} else {
prompt = getRandomPromptUsingFilter(prompts, promptTrackingData);
filterFromPrompt = addPromptIndexToNewFilter(prompt, prompts);
promptTrackingData = unionFilters(promptTrackingData, filterFromPrompt);
}
this.trackingObject[promptHash] = {
promptTrackingData: promptTrackingData,
lastPromptLocation: filterFromPrompt,
};
return prompt;
}
getTrackingObject() {
return this.trackingObject;
}
}
function getRandomPromptUsingFilter(prompts, filter) {
let filteredPrompts = prompts.filter((x, i) => !filter[i]);
return filteredPrompts[Math.floor(Math.random() * (filteredPrompts.length))];
}
function addPromptIndexToNewFilter(prompt, prompts) {
return prompts.map(x => (x === prompt) ? 1 : 0);
}
function unionFilters(firstFilter, secondFilter) {
return firstFilter.map((x, i) => (x || secondFilter[i]) ? 1 : 0);
}
exports.ResponsePicker = ResponsePicker;