rules = {
const rules = []
function fromList(list) {
const subRules = list.split(" ")
return (msg) => {
for (const r of subRules) {
const [b, left] = rules[r](msg)
if (!b) return [false, left]
msg = left
}
return [true, msg]
}
}
for (const lines of parsed[0].split('\n')) {
const [i, list] = lines.split(': ')
if (list.includes('"')) {
const [, ch] = list.match(/"([^"]+)"/)
rules[i] = msg => [ msg[0] === ch, msg.slice(1) ]
} else if (list.includes("|")) {
const parts = list.split(' | ').map(fromList)
rules[i] = (msg) => parts.map(p => p(msg)).find(p => p[0]) || [false, msg]
} else {
rules[i] = fromList(list)
}
}
return rules
}