#ifndef __LIST__
#define __LIST__

#define L List_T
typedef struct L *L;

struct L
{
    void *val;
    L next;
};

extern L List_init(void);
extern L List_push(L list, void *val);
extern int List_length(L list);
extern void **List_toArray(L list);
extern L List_append(L list, L tail);
extern L List_list(L list, void *val, ...);
/* TODO */
extern L List_copy(L list);
extern int List_pop(L *list);

#undef L
#endif

List