/**
 * See Copyright Notice in picrin.h
 */

#include "picrin.h"
#include "value.h"
#include "object.h"

pic_value
pic_make_record(pic_state *pic, pic_value type, pic_value datum)
{
  struct record *rec;

  rec = (struct record *)pic_obj_alloc(pic, PIC_TYPE_RECORD);
  rec->type = sym_ptr(pic, type);
  rec->datum = datum;

  return obj_value(pic, rec);
}

pic_value
pic_record_type(pic_state *pic, pic_value rec)
{
  return obj_value(pic, rec_ptr(pic, rec)->type);
}

pic_value
pic_record_datum(pic_state *pic, pic_value rec)
{
  return rec_ptr(pic, rec)->datum;
}

static pic_value
pic_rec_make_record(pic_state *pic)
{
  pic_value type, datum;

  pic_get_args(pic, "mo", &type, &datum);

  return pic_make_record(pic, type, datum);
}

static pic_value
pic_rec_record_p(pic_state *pic)
{
  pic_value rec;

  pic_get_args(pic, "o", &rec);

  return pic_bool_value(pic, pic_rec_p(pic, rec));
}

static pic_value
pic_rec_record_type(pic_state *pic)
{
  pic_value rec;

  pic_get_args(pic, "r", &rec);

  return pic_record_type(pic, rec);
}

static pic_value
pic_rec_record_datum(pic_state *pic)
{
  pic_value rec;

  pic_get_args(pic, "r", &rec);

  return pic_record_datum(pic, rec);
}

void
pic_init_record(pic_state *pic)
{
  pic_defun(pic, "make-record", pic_rec_make_record);
  pic_defun(pic, "record?", pic_rec_record_p);
  pic_defun(pic, "record-type", pic_rec_record_type);
  pic_defun(pic, "record-datum", pic_rec_record_datum);
}