/* File: lists.c
 * Author: Jim Mayfield
 */

#include <stdlib.h>
#include <assert.h>

typedef void *list_item_type;

typedef struct list_tag {
  list_item_type data;
  struct list_tag *next;
} list_struct;

#include "lists.h"

list_type
cons(list_item_type value, list_type list)
{
  list_type result;

  result = malloc(sizeof(list_struct));
  assert(result != NULL);
  result->data = value;
  result->next = list;
  return(result);
}

list_item_type
first(list_type list)
{
  assert(list != NULL);
  return(list->data);
}

list_type
rest(list_type list)
{
  assert(list != NULL);
  return(list->next);
}

BOOL
empty_list(list_type list)
{
  return(list == NULL);
}
