Humans are known to panic. This is widely considered bad design.
function eat(f: string) {
if (f === '🌯') ...
else throw; // panic
}
Panic is not useful™. What's useful is a thorough assessment of the circumstances. dontpanic
brings you blazingly steadfast abstractions that help you recover from failure and guide your code to success.
DontPanic(eat)('🌯').onSuccess(sleep).onFailure(getPizza); // 🍕 Don't panic
Unhandled throw
s crash your program and send it into an unrecoverable state.
throw new Error('Invalid input'); // 🚯 Crash risk
return Failed('Invalid input'); // 🛣 No crash risk
99.9% of the time there is no need to panic.
Throwable functions do not encode potential in their type signature.
const parsed = JSON.stringify(input); // ⚠️ Number, may crash
DontPanic(JSON.stringify)(input); // ✅ Outcome<string, Error>
Explicit is better than implicit.
Try/catch creates new execution scopes.
try {
const parsed = JSON.parse(input);
try {
const validated = validateInput(parsed);
register(validated);
} catch (e) {
handleValidationError(e);
}
} catch (e) {
handleParsingError(e); // 🪹 Far away from home
}
DontPanic(JSON.parse)(input) // 🥞
.onFailure(handleParsingError)
.onSuccess(validateInput)
.onFailure(handleValidationError)
.onSuccess(register);
Flatten your error handling.
npm install @sidiousware/dontpanic