/* maybe.h */
#pragma once
#define _GNU_SOURCE
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>

typedef unsigned char int8;
typedef unsigned short int int16;
typedef unsigned int int32;

#define $1 (int8 *)
#define $2 (int16)
#define $4 (int32)
#define $i (int)
#define $c (char *)
#define $v (void *)

#define alloc(x)    malloc((int16)(x))
#define destroy(x)  free((x))
#define show(x)     _Generic((x), \
    Maybe*: showmaybe \
)(# x, (x))
#define empty(x)        ((!(x)) || (!(x)->type))
#define all(x,args...)    _all((x), args, (Maybe *)0)

#define Nothing false
#define Just true

struct s_maybe {
    bool type;
    void *val;
};
typedef struct s_maybe Maybe;

void zero(int8*,int16);
Maybe *maybe(bool,void*);
void showmaybe(int8*,Maybe*);
bool findchar(int8*, int8);
int16 stringlen(int8*);
bool _all(Maybe*,...);

Maybe *hasat(int8*);
Maybe *hasdot(int8*);
Maybe *checklength(int8*);
Maybe *validate(int8*);

int main(int,char**);







