/
Gap.pm
55 lines (42 loc) · 965 Bytes
/
Gap.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package Array::Gap;
use strict;
use warnings;
use base qw/Class::Accessor::Lvalue::Fast/;
use Array::Gap::Iterator;
__PACKAGE__->mk_accessors(qw/previous bin/);
use overload
'""' => 'as_string',
'@{}' => 'as_array',
fallback => 1;
sub new {
my ($class, $bin) = @_;
my $self = bless $class->SUPER::new, $class;
if ($bin) {
$self->bin = $bin;
$self->previous = $self->as_array->[-1]; ## hmm..
} else {
$self->previous = 0;
}
return bless $self, $class;
}
sub push {
my ($self, $n) = @_;
$self->bin .= pack('w', $n - $self->previous);
$self->previous = $n;
return $n;
}
sub iterator {
return Array::Gap::Iterator->new(shift->bin);
}
sub as_array {
my @values;
my $it = shift->iterator;
while ($it->has_next) {
CORE::push @values, $it->next;
}
return \@values;
}
sub as_string {
return join ' ', unpack('B*', shift->bin);
}
1;