Created
April 5, 2026 19:20
-
-
Save monokrome/a3c96d34370d5eae40d35f3d89ff92c5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* generic monad */ | |
| typedef struct { | |
| int has_value; | |
| void *value; | |
| } Maybe; | |
| /* Per use-case struct */ | |
| typedef struct { Maybe m; } MaybeInt; | |
| typedef struct { Maybe m; } MaybeStr; | |
| typedef struct { Maybe m; } MaybePoint; | |
| static MaybeInt maybe_int(int x) { | |
| int *p = malloc(sizeof *p); *p = x; | |
| return (MaybeInt){ .m = { 1, p } }; | |
| } | |
| static MaybeInt maybe_int_none(void) { | |
| return (MaybeInt){ .m = { 0, NULL } }; | |
| } | |
| static int maybe_int_get(MaybeInt mi) { | |
| int v = *(int*)mi.m.value; | |
| free(mi.m.value); | |
| return v; | |
| } | |
| int x = maybe_int_get(a); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment