--- /dev/null
+#include <stdlib.h> // for malloc, free
+#include <string.h> // for strcmp
+#include "bits/callback.h" // for Callback, Comparator, Transformer
+#include "bits/wrappers.h"
+#include "list.h"
+
+#define ITER_REFS node = &list->fst; *node != NULL; node = &(*node)->nxt
+
+void list_ini(List *list)
+{
+ list->fst = NULL;
+ list->end = &list->fst;
+}
+
+WRAP_NODE_FUNCTIONS(List, list_)
+
+void list_apd(List *list, void *dat)
+{
+ list_nmk(list, list->end, dat);
+}
+
+void list_ppd(List *list, void *dat)
+{
+ ListNode *fst = list->fst;
+ list_nmk(list, &list->fst, dat);
+ list->fst->nxt = fst;
+}
+
+ListNode **list_nfd(List *list, void *key, void *cmp)
+{
+ ListNode **node;
+
+ for (ITER_REFS)
+ if (((Comparator) cmp)((*node)->dat, key) == 0)
+ return node;
+
+ return node;
+}
+
+void list_nmk(List *list, ListNode **node, void *dat)
+{
+ *node = malloc(sizeof **node);
+ (*node)->dat = dat;
+ (*node)->nxt = NULL;
+
+ if (list->end == node)
+ list->end = &(*node)->nxt;
+}
+
+void list_nrm(List *list, ListNode **node)
+{
+ ListNode *old = *node;
+ *node = old->nxt;
+
+ if (list->end == &old->nxt)
+ list->end = node;
+
+ free(old);
+}
+
+void list_itr(List *list, void *iter, void *arg, void *trans)
+{
+ LIST_ITERATE(list, node)
+ ((Callback) iter)(trans ? ((Transformer) trans)(node->dat) : node->dat, arg);
+}
+
+void list_clr(List *list, void *iter, void *arg, void *trans)
+{
+ for (ListNode *node = list->fst; node != NULL;) {
+ ListNode *next = node->nxt;
+
+ if (iter)
+ ((Callback) iter)(trans ? ((Transformer) trans)(node->dat) : node->dat, arg);
+
+ free(node);
+ node = next;
+ }
+
+ list_ini(list);
+}