Comments (4)
It's been a while, but I never closed this because I intend to implement this fallback behavior. It makes sense, the default case handling through ??
is actually what I do too but it's a bit unintuitive. Thanks for raising the issue.
Match will get a helper function (like partial) and matcher will get another function that achieves the same functionality.
from variant.
Hello!
This is an interesting situation where are your type-time expectations differ from your runtime truth. I think it would be appropriate to add a guard in front of the match, accounting for this unanticipated widening of the possibilities.
const calculateIfBattleWasAbandoned = (reason: BattleFinishedReason): boolean => {
if (isOfVariant(reason, BattleFinishedReason)) {
return matchKind(reason, {
timeout: () => true,
surrender: () => true,
attack: () => false,
cancel: () => true,
});
} else {
// Saving future me some headaches
// log the edge case
return false;
}
}
If BattleFinishedReason
is a variant, then the above call to isOfVariant
works well. If not, you can write your own check. It could be as simple as
const validTypes = [
`attack`,
`cancel`,
`surrender`,
`timeout`,
]
const calculateIfBattleWasAbandoned = (reason: BattleFinishedReason): boolean => {
if (validTypes.includes(reason.type)) {
return matchKind(reason, {
timeout: () => true,
surrender: () => true,
attack: () => false,
cancel: () => true,
});
} else {
// Saving future me some headaches
// log the edge case
return false;
}
}
This gives an error checking flow outside the match allowing us to handle the unexpected cases, while also benefiting from exhaustiveness for when things do work out our way. How does that strike you?
from variant.
Yes this is effectively the solution I came ypu with too..
export const calculateIfBattleWasAbandoned = (reason: BattleFinishedReason ): boolean =>
matchKind(reason, {
timeout: () => true,
surrender: () => true,
attack: () => false,
}) ?? false
I thought I would bring up up incase there was a better way tho.
Thanks :)
Feel free to close.
from variant.
Hello, I have a new update that should address this issue. Please let me know if I've missed any of the desired functionality. These changes are available in 3.0.0-dev.25
I've added a withFallback
helper. It takes two parameters, a completed handler object and a fallback function. As these cases are exceptional, I left the fallback function's input as unknown
.
export const calculateIfBattleWasAbandoned = (reason: BattleFinishedReason): boolean =>
match(reason, withFallback({
timeout: () => true,
surrender: () => true,
attack: () => false,
}, () => false))
For matcher()
rather than adding it as a new terminal, I expanded .complete()
to include this fallback functionality, since I expect users would still want exhaustiveness. Here's an example of that in use:
export const calculateIfBattleWasAbandoned = (reason: BattleFinishedReason): boolean =>
matcher(reason)
.when(['timeout', 'surrender'], () => true)
.when('attack', () => false)
.complete({
withFallback: () => false
})
On the redux side, my rootReducer
now looks like this:
export const rootReducer = (state = initState, action: Action) => {
return matcher(action)
.when(types(AppAction), _ => ...)
.when(types(GameAction), _ => ...)
.complete({
withFallback: _ => state, // pass through redux init and persist actions
})
};
which I would call an upgrade. I hope you feel the same.
from variant.
Related Issues (20)
- Scoped Variants (/namespaces) HOT 3
- Require cycle in generic.ts HOT 2
- custom match creator HOT 8
- Generic variant usage with function as payload HOT 3
- matcher that doesnt require an object HOT 3
- No compiler error from method with variant HOT 4
- Variant 3.0 HOT 32
- Idea: Variation helper type to extract a variant HOT 1
- Early 2022 Update HOT 1
- Add rx/js examples to documentation
- Expand documentation for the catalog function with integration examples
- Re-explore scoped variants
- A good DX for custom discriminants
- Tree shaking and bundle size
- Move documentation to its own branch
- VariantCreator output hinting for custom discriminants HOT 6
- Shoutout! HOT 2
- `variantModule` export is missing HOT 34
- Change the `type` field HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from variant.