Skip to content

Instantly share code, notes, and snippets.

@monokrome
Created April 5, 2026 19:20
Show Gist options
  • Select an option

  • Save monokrome/a3c96d34370d5eae40d35f3d89ff92c5 to your computer and use it in GitHub Desktop.

Select an option

Save monokrome/a3c96d34370d5eae40d35f3d89ff92c5 to your computer and use it in GitHub Desktop.
/* 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