# 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;
}
}