//#define NULE 0
//#define MULE 8888

#define true 1
#define false 0

typedef struct NOIDEA_memory
{
	int id;
	int size;
	struct NOIDEA_memory * last;
	struct NOIDEA_memory * next;
} NOIDEA_memory;

typedef struct NOIDEA_yromem
{
	NOIDEA_memory * space;
	int id;
} NOIDEA_yromem;

NOIDEA_memory * NOIDEA_seg (void * , int );
void * NOIDEA_alloc (NOIDEA_memory * , int );
void NOIDEA_free (NOIDEA_memory * , void * );

//==========================

typedef struct NOIDEA_node
{
	void * pack;
	struct NOIDEA_node * last;
	struct NOIDEA_node * next;
} NOIDEA_node;

NOIDEA_node * NOIDEA_create (NOIDEA_node * noidea_src, void * noidea_pack, void * noidea_ptr);
void * NOIDEA_destroy (NOIDEA_node * noidea_src, NOIDEA_node * noidea_nud);
void * NOIDEA_loop (NOIDEA_node * noidea_src);
void * NOIDEA_rev (NOIDEA_node * noidea_src);
//==========================

typedef struct NOIDEA_agenda
{
	int type;	//identify type of node
	NOIDEA_node * node;		//the node that list it
	signed long int wait;		//interval between call
	void (*func)(void);		//function to call
	signed long int till;		//wait till to execute
	signed long int idle;		//time left before execute
	signed long int loop;		//value that end loop
} NOIDEA_agenda;

NOIDEA_node * NOIDEA_schedule (NOIDEA_node * , void (*)(void), signed long int  ,void * );
NOIDEA_node * NOIDEA_reschedule (NOIDEA_node * , NOIDEA_node * , signed long int );
void * NOIDEA_cancel (NOIDEA_node * , NOIDEA_node * );
signed long int NOIDEA_do (NOIDEA_node * , signed long int );



//===================================
typedef struct NOIDEA_event
{
	int type;	//identify the node type
	NOIDEA_node * node;		//the node that list it
	int event;			//event number that will summon it
	void (*funct)(void);		//function to call at given event
} NOIDEA_event;

NOIDEA_node * NOIDEA_plug (NOIDEA_node * , int , void (*)(void), void * );
void * NOIDEA_unplug (NOIDEA_node * , NOIDEA_event * );
void NOIDEA_eventloop (NOIDEA_node * , int );
