# Copyright (c) 2023 Yuki Kimoto
# MIT License

class Immutable::ByteList {
  version_from SPVM;

  use Fn;
  use Array;
  
  # Fields
  has length : ro int;
  has array : byte[];
  
  # Class methods
  static method new : Immutable::ByteList ($array : byte[] = undef) {
    my $length : int;
    if ($array) {
      $length = @$array;
    }
    else {
      $length = 0;
    }
    
    my $self = &new_len($length);
    
    if ($array) {
      Array->memcpy_byte($self->{array}, 0, $array, 0, $length);
    }
    
    return $self;
  }
  
  static method new_len : Immutable::ByteList ($length : int) {
    my $self = new Immutable::ByteList;
    
    unless ($length >= 0) {
      die "The length \$length must be greater than or equal to 0.";
    }
    
    $self->{length} = $length;
    $self->{array} = new byte[$length];
    
    return $self;
  }
  
  # Instance methods
  method get : int ($index : int) {
    my $length = $self->length;
    
    unless ($index >= 0) {
      die "The index \$index must be greater than or equal to 0.";
    }
    
    unless ($index < $length) {
      die "The index \$index must be less than the length of \$list.";
    }
    
    my $element = $self->{array}[$index];
    
    return $element;
  }
  
  method to_array : byte[] () {
    my $length = $self->length;
    
    my $new_array = new byte[$length];
    
    my $array = $self->{array};
    
    Array->memcpy_byte($new_array, 0, $array, 0, $length);
    
    return $new_array;
  }
}