#include "Subrange.h"
#pragma implementation

Subrange::Subrange (Value* inval , int begin , int end){
  length = end - begin + 1;
  switch (inval->type)
    {case LIST:
      for (sublist = inval->list ; begin > 1 ; begin--)
	sublist = sublist->next;
      original = inval->grab();
      return;
    case SUBR:
      original = inval->sub->original->grab();
      for (sublist = inval->sub->sublist ; begin > 1 ; begin--)
	sublist = sublist->next;
      return;}
}

Subrange::~Subrange (){
  original->release();
}

Value* Subrange::copy_full_val(){
  return new Value (sublist->copy_some (length));
}
Val_List* Subrange::copy_full_list(){
  return sublist->copy_some (length);
}

int Subrange::get_length(){
  return length;
}

Value* Subrange::nth(int i){
  Val_List* temp;
  if (i <  1)  return NULL;
  for (temp = sublist , i-- ; i ; i-- , temp=temp->next)
    if (!temp->next)
      return NULL;
  return temp->elem;
}