File Coverage

blib/lib/Padre/Plugin/Swarm/Resource.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             package Padre::Plugin::Swarm::Resource;
2 1     1   38551 use strict;
  1         1  
  1         32  
3 1     1   6 use warnings;
  1         1  
  1         23  
4 1     1   1660 use Padre::Logger;
  0            
  0            
5             use Time::HiRes 'time';
6             use Digest::JHash 'jhash';
7              
8             use Class::XSAccessor
9             accessors => [qw(
10             id
11             zerotime
12             zerohash
13             sequence
14             body
15             project
16             path
17             history
18             )];
19            
20             my $MAX_HISTORY = 200;
21              
22             sub new {
23             my ($class,@args) = @_;
24             my $self = bless {@args} , ref($class)||$class;
25             $self->zerotime( time() );
26             $self->zerohash( jhash($self->body) );
27             $self->history( [] );
28             $self->sequence( 1 ) unless $self->sequence;
29            
30            
31             return $self;
32             }
33              
34             sub _add_history {
35             my ($self,$edit) = @_;
36             my $dtime = time() - $self->zerotime;
37             unshift @{ $self->history } , [ $self->sequence, $dtime , $edit ];
38              
39             }
40              
41             sub _merge_history {
42             my ($self,$edit) = @_;
43             my $r_delta = $edit->delta_time;
44             my $r_sequence = $edit->sequence;
45            
46             my $history = $self->history;
47             my $i = $#{ $history };
48             my @consider;
49             for (0..$i) {
50             my $h = $history->[$i];
51             if (
52             $h->[0] >= $r_sequence
53             and
54             $h->[1] <= $r_delta
55             ) {
56             push @consider, $i;
57             }
58             }
59            
60            
61              
62             }
63              
64             sub perform_edit {
65             my ($self,$edit) = @_;
66            
67             my $sequence = $self->sequence;
68             $sequence++;
69             $self->sequence($sequence);
70            
71             $self->_add_history( $edit );
72            
73            
74              
75             }
76              
77             sub perform_remote_edit {
78             my ($self,$edit) = @_;
79             my $r_deltatime = $edit->delta_time;
80             my $r_sequence = $edit->sequence;
81             if ( $r_sequence <= $self->sequence ) {
82             TRACE( 'Out of sequence edit arrived late' );
83             # find all edits that 'beat' this one
84             # where sequence is equal or greater AND
85             # delta_time is less than this edit
86             ##
87             # step through each of the 'winning' edits
88             # and transform the position of this rogue edit
89             # based on inserts or deletes that have occurred
90             # earlier in the document stream
91             $self->_merge_history($edit);
92            
93            
94             } elsif ( $r_sequence > 1 + $self->sequence ) {
95             TRACE( 'Out of sequence edit arrived AHEAD of our sequence' );
96             # WTF do we do now? - we're missing some of the edit stream.
97             die \"SYNC";
98             } else {
99             # just apply the damn edit.
100             $self->sequence( $edit->sequence );
101             $self->_add_history($edit);
102            
103             }
104            
105            
106             }
107              
108              
109             1;