#ifndef __SLIST_H__
#define __SLIST_H__
#include "stddef.h"

typedef struct slist_item {
  struct slist_item *next;
  struct slist_item *prev;
  void *data;
} slist_item;

typedef struct slist_list {
  slist_item *first;
  slist_item *last;
} slist_list;

typedef int slist_callback_finalize(void*);

slist_list* slist_create(slist_list *list);

void slist_insert_first(slist_list *list, void* data);
void slist_insert_last(slist_list *list, void* data);

void *slist_delete_first(slist_list *list);
void *slist_delete_last(slist_list *list);

void slist_empty(slist_list *list, bool free_item);
void slist_empty_finalize(slist_list *list, slist_callback_finalize finalizer);
slist_list* slist_destroy(slist_list *list);

slist_item* slist_iterate(slist_list *list, slist_item* current);

#endif
