# --------------------------------------------------------------------------- #
# Array Container
# --------------------------------------------------------------------------- #
^Array := ^Class.new({});
^Array.set_name('Array');
^Array.set_version('0.0.1');
^Array.set_authority('url:pugscode.org');
^Array.set_superclasses([ ^List ]);
^Array.add_method('new', -> %params {
"inside Array.new ..."`trace();
^Array`create('p6array', %params)
});
^Array.add_method('BUILDALL', -> %params {
"inside Array.BUILDALL ..."`trace();
nil
});
^Array.add_method('BUILD', -> %params {
"inside Array.BUILD ..."`trace();
nil
});
^Array.add_method('FETCH', -> $i { self`fetch_elem($i) } );
^Array.add_method('STORE', -> $i, $x { self`store_elem($i, $x); self } );
^Array.add_method('FETCH_LIST', -> { self`fetch_list() } );
^Array.add_method('STORE_LIST', -> @x { self`store_list(@x); self } );
# override the immutable List.reverse
# with this mutable version
^Array.add_method('reverse', -> {
self.STORE_LIST(self.FETCH_LIST()`reverse());
});
# --------------------------------------------------------------------------- #
# Array Role
# --------------------------------------------------------------------------- #
^rArray := ^Role.new({});
^rArray.set_name('Array');
^rArray.set_version('0.0.1');
^rArray.set_authority('url:pugscode.org');
^rArray.add_method('pop', -> {
$elem := self.FETCH(self.elems()`decrement());
# this is a ugly kludge for now :-/
self.STORE_LIST(self.FETCH_LIST()`reverse()`splice(1)`reverse());
$elem;
});
^rArray.add_method('push', -> $elem {
self.STORE_LIST(self.FETCH_LIST()`concat([ $elem ]));
});
^rArray.add_method('shift', -> {
$elem := self.FETCH(0);
self.STORE_LIST(self.FETCH_LIST()`splice(1));
$elem;
});
^rArray.add_method('unshift', -> $elem {
self.STORE_LIST([ $elem ]`concat(self.FETCH_LIST()));
});
^rArray.add_method('delete', -> @indices {});
^rArray.add_method('exists', -> @indices {});
^rArray.add_method('splice', -> $offset, $length, @values {});
^rArray.add_method('keys', -> {
-> @list, @acc {
&redo := &?SUB;
@list`is_empty()`if_else(
-> { $?CLASS`create('p6array', @acc) },
-> { &redo`(@list`splice(1), @acc`push(@acc`length())) }
);
}`(self.FETCH_LIST(), []);
});
^rArray.add_method('values', -> { self });
^rArray.add_method('pairs', -> {
-> @list, @acc {
&redo := &?SUB;
@list`is_empty()`if_else(
-> { $?CLASS`create('p6array', @acc) },
-> {
&redo`(
@list`splice(1),
@acc`push(^Pair.new({
'k' => @acc`length(),
'v' => @list`fetch(0)
}))
)
}
);
}`(self.FETCH_LIST(), []);
});
^rArray.add_method('kv', -> {
-> @list, @acc {
&redo := &?SUB;
@list`is_empty()`if_else(
-> { $?CLASS`create('p6array', @acc) },
-> {
&redo`(
@list`splice(1),
@acc`push(^Array`create('p6array', [
@acc`length(),
@list`fetch(0)
]))
)
}
);
}`(self.FETCH_LIST(), []);
});
# --------------------------------------------------------------------------- #
# Bootstrap Array Container to Array Role
# --------------------------------------------------------------------------- #
^Array.set_roles([ ^rArray ]);
^Array.resolve();