Ramda - Zahlensequenz validieren

Ich musste sicherstellen dass ich keine Events verpasse. Deshalb hab ich ein Konzept mit einer Nummer gebaut die bei jedem Event hochzählt. Wenn die Nummern nicht aufeinanderfolgend sind, weiß ich dass die Collection nicht valide ist.

Die Lösung nutzt Ramda für funktionale Validierung: Events werden sortiert, die Nummern extrahiert, und per reduce geprüft ob jede Nummer ein Increment zur vorherigen ist.

Dataset

const data = {
'transactions': [{
'transaction': 'A',
'events': [{
'number': 0 // <-- Valid
}, {
'number': 1 // <-- Valid
}]
}, {
'transaction': 'C',
'events': [{
'number': 5 // <-- Valid
}, {
'number': 6 // <-- Valid
}]
}, {
'transaction': 'B',
'events': [{
'number': 3,
}, {
'number': 10, // <-- Nicht valid weil Events fehlen
}]
}]
};

Code

const eventsAreIncrementing = R.pipe(
R.sortBy(R.prop('number')), // Events sortieren
R.map(R.prop('number')), // Liste der Event-Nummern holen
R.reduce((acc, current) => {
if (acc === false) return false; // Skip wenn wir schon einen fehlerhaften Wert gefunden haben
// Für das erste Element das aktuelle zurückgeben
// oder
// Checken ob das aktuelle Element ein Increment vom vorherigen ist
if (acc === null || acc + 1 === current) { return current; }
return false; // False zurückgeben um zu signalisieren dass die Sequenz nicht um 1 inkrementiert
}, null),
R.is(Number) // Reduce gibt false zurück wenn die Nummern nicht aufeinanderfolgend sind, sonst die letzte Nummer
// Deshalb check ich ob das Ergebnis eine Nummer ist
);

const allEventsAreIncrementing = R.pipe(
R.map(R.prop('events')),
R.all(eventsAreIncrementing)
);

const valid = allEventsAreIncrementing(data.transactions);