#include <stddef.h>
#include <assert.h>

#include "sysdep.h"
#include "msg.h"
#include "foldt.h"
#include "folderP.h"

AlFolder AlFolder_create(folder_type, folder_name)
     AlFoldT folder_type;
     const char *folder_name;
{
  AlFoldT_FoldObj temp;
  AlFolder_rep *new_obj;
  new_obj = create();

  temp = AlFoldT_create_func(folder_type)(folder_name, new_obj);
  if (temp == NULL) {
    destroy(new_obj);
    return NULL;
  }
  new_obj->type = folder_type;
  new_obj->the_folder = temp;
  return raise(new_obj);
}

NORET AlFolder_destroy(folder)
     AlFolder folder;
{
  AlFolder_rep *temp = lower(folder);

  assert(folder != NULL);
  (AlFoldT_destroy_func(temp->type))(temp->the_folder);
  destroy(temp);
}

AlFolderIter AlFolder_iter_create(folder, recurse)
     AlFolder folder;
     Bool recurse;
{
  AlFolderIter_rep *new_iter = create_iter();

  assert(folder != NULL);
  new_iter->the_folder = folder;
  new_iter->the_iter = 
    (AlFoldT_iter_create_func(lower(folder)->type))
      (lower(folder)->the_folder, recurse);
  return raise_iter(new_iter);
}

NORET AlFolder_iter_destroy(iter)
     AlFolderIter iter;
{
  AlFolderIter_rep *temp = lower_iter(iter);

  assert(iter != NULL);
  (AlFoldT_iter_destroy_func(lower(temp->the_folder)->type))
    (temp->the_iter);
  destroy_iter(temp);
}

Msg AlFolder_iter_get(iter)
     AlFolderIter iter;
{
  AlFolderIter_rep *temp = lower_iter(iter);

  assert(iter != NULL);
  return (AlFoldT_iter_get_func(lower(temp->the_folder)->type))
    (temp->the_iter);
}

