# Copyright (c) 2023 Yuki Kimoto # MIT License class Immutable::StringList { version_from SPVM; use Fn; use Array; # Fields has length : ro int; has array : string[]; # Class methods static method new : Immutable::StringList ($array : string[] = undef) { my $length : int; if ($array) { $length = @$array; } else { $length = 0; } my $self = &new_len($length); if ($array) { for (my $i = 0; $i < $length; $i++ ) { my $value = copy $array->[$i]; make_read_only $value; $self->{array}[$i] = $value; } } return $self; } static method new_len : Immutable::StringList ($length : int) { my $self = new Immutable::StringList; unless ($length >= 0) { die "The length \$length must be greater than or equal to 0."; } $self->{length} = $length; $self->{array} = new string[$length]; return $self; } # Instance methods method get : string ($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 : string[] () { my $length = $self->length; my $new_array = new string[$length]; my $array = $self->{array}; Array->memcpy_string_address($new_array, 0, $array, 0, $length); return $new_array; } }