sclass ExtendedCSVParser { S csv; *() {} *(S *csv) {} run { int i = 0, startOfValue = 0; bool inQuotedValue; while (i < l(csv)) { char c = csv.charAt(i); if (c == ',') { foundValue(substring(csv, startOfValue, i)); i++; startOfValue = i; } else if (c == '\r' || c == '\n') { } else if (c == '"') { } else i++; } if (startOfValue < l(csv)) foundValue(substring(csv, startOfValue)); } swappable void foundValue(S value) {} swappable void endOfRecord() {} }