interleave = (sepBy, terms) => str => {
const firstRead = terms(str)
if (firstRead.error) return firstRead
let rest = firstRead.rest
let read = firstRead.read
while(rest !== '') {
const a = sepBy(rest)
if (a.error) return {error: false, read: read, rest}
const b = terms(a.rest)
if (b.error) return b
rest = b.rest
read = [...read, ...a.read, ...b.read]
}
return {error: false, read, rest}
}