diff options
author | Gianni Ceccarelli <dakkar@thenautilus.net> | 2011-11-10 15:10:26 +0000 |
---|---|---|
committer | Gianni Ceccarelli <dakkar@thenautilus.net> | 2011-11-10 15:10:26 +0000 |
commit | dc07be4ac45756a0e664ee29e888f86b7609784a (patch) | |
tree | dca7e4467f73625604886e8910a609ccc978b0ce | |
parent | 'clear' almost completely implemneted (diff) | |
download | data-multivalued-dc07be4ac45756a0e664ee29e888f86b7609784a.tar.gz data-multivalued-dc07be4ac45756a0e664ee29e888f86b7609784a.tar.bz2 data-multivalued-dc07be4ac45756a0e664ee29e888f86b7609784a.zip |
move up a level
-rw-r--r-- | .gitignore | 10 | ||||
-rw-r--r-- | Changes (renamed from Data-MultiValued/Changes) | 0 | ||||
-rw-r--r-- | Data-MultiValued/.gitignore | 13 | ||||
-rw-r--r-- | attr.pl | 363 | ||||
-rw-r--r-- | dist.ini (renamed from Data-MultiValued/dist.ini) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/AttributeAccessors.pm (renamed from Data-MultiValued/lib/Data/MultiValued/AttributeAccessors.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/AttributeTrait.pm (renamed from Data-MultiValued/lib/Data/MultiValued/AttributeTrait.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/AttributeTrait/Ranges.pm (renamed from Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Ranges.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/AttributeTrait/Tags.pm (renamed from Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm (renamed from Data-MultiValued/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/Exceptions.pm (renamed from Data-MultiValued/lib/Data/MultiValued/Exceptions.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/RangeContainer.pm (renamed from Data-MultiValued/lib/Data/MultiValued/RangeContainer.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/Ranges.pm (renamed from Data-MultiValued/lib/Data/MultiValued/Ranges.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/TagContainer.pm (renamed from Data-MultiValued/lib/Data/MultiValued/TagContainer.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/TagContainerForRanges.pm (renamed from Data-MultiValued/lib/Data/MultiValued/TagContainerForRanges.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/Tags.pm (renamed from Data-MultiValued/lib/Data/MultiValued/Tags.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/TagsAndRanges.pm (renamed from Data-MultiValued/lib/Data/MultiValued/TagsAndRanges.pm) | 0 | ||||
-rw-r--r-- | lib/Data/MultiValued/UglySerializationHelperRole.pm (renamed from Data-MultiValued/lib/Data/MultiValued/UglySerializationHelperRole.pm) | 0 | ||||
-rw-r--r-- | t/json.t (renamed from Data-MultiValued/t/json.t) | 0 | ||||
-rw-r--r-- | t/moose-ranges.t (renamed from Data-MultiValued/t/moose-ranges.t) | 0 | ||||
-rw-r--r-- | t/moose-tagged.t (renamed from Data-MultiValued/t/moose-tagged.t) | 0 | ||||
-rw-r--r-- | t/more-overlapping-ranges.t (renamed from Data-MultiValued/t/more-overlapping-ranges.t) | 0 | ||||
-rw-r--r-- | t/overlapping-ranges.t (renamed from Data-MultiValued/t/overlapping-ranges.t) | 0 | ||||
-rw-r--r-- | t/ranges-setting.t (renamed from Data-MultiValued/t/ranges-setting.t) | 0 | ||||
-rw-r--r-- | t/simple-setting.t (renamed from Data-MultiValued/t/simple-setting.t) | 0 | ||||
-rw-r--r-- | t/tags-ranges-setting.t (renamed from Data-MultiValued/t/tags-ranges-setting.t) | 0 | ||||
-rw-r--r-- | t/tags-setting.t (renamed from Data-MultiValued/t/tags-setting.t) | 0 |
27 files changed, 10 insertions, 376 deletions
@@ -1,3 +1,13 @@ +blib +pm_to_blib *.sw? +Makefile +Makefile.old +MANIFEST.bak *.tar.gz +/inc/ +META.yml +.prove *~ +/.build/ +/Data-/ diff --git a/Data-MultiValued/Changes b/Changes index 3d14c89..3d14c89 100644 --- a/Data-MultiValued/Changes +++ b/Changes diff --git a/Data-MultiValued/.gitignore b/Data-MultiValued/.gitignore deleted file mode 100644 index a916a46..0000000 --- a/Data-MultiValued/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -blib -pm_to_blib -*.sw? -Makefile -Makefile.old -MANIFEST.bak -*.tar.gz -/inc/ -META.yml -.prove -*~ -/.build/ -/Data-/ diff --git a/attr.pl b/attr.pl deleted file mode 100644 index de90bd8..0000000 --- a/attr.pl +++ /dev/null @@ -1,363 +0,0 @@ -#!/usr/bin/perl - -=head1 SYNOPSIS - - package My::Class; - use Moose; - - has stuff => ( - is => 'rw', - isa => 'Int', - traits => ['Timed'], - predicate => 'has_stuff', - clearer => 'clear_stuff', - ); - -Later: - - my $obj = My::Class->new(); - - $obj->stuff(3); # sets value for every interval - $obj->stuff_timed({},3); # sets value the "default" interval - $obj->stuff_timed({from=>$timestamp,to=>$timestamp2},3); # sets value for the given time interval - - print $obj->stuff(); # value for time(); - print $obj->stuff_timed(); # as above - print $obj->stuff_timed({when=>$timestamp}); # as above, for given time - - print $obj->has_stuff(); # true if we have a value for time() - print $obj->has_stuff_timed(); # as above - print $obj->has_stuff_timed({when=>$timestamp}); # as above, for given time - - $obj->clear_stuff(); # deletes everything - $obj->clear_stuff_timed({}); # deletes the "default" interval - $obj->clear_stuff_timed({from=>$timestamp,to=>$timestamp2}); # deletes the given time interval - -=cut - -use strict; -use warnings all=>'FATAL'; - -package My::Attribute;{ -use Moose::Role; -use MooseX::Types::Moose qw(ArrayRef Int Any); -use MooseX::Types::Structured qw(Dict); -use Moose::Util::TypeConstraints (); -use namespace::autoclean; - -before _process_options => sub { - my ($self, $name, $options) = @_; - - my $value_type; - $value_type //= $options->{isa} ? - Moose::Util::TypeConstraints::find_or_create_isa_type_constraint($options->{isa}) - : undef; - $value_type //= $options->{does} ? - Moose::Util::TypeConstraints::find_or_create_does_type_constraint($options->{does}) - : undef; - - $value_type //= Any; - - $options->{isa} = ArrayRef[Dict[ - from => Int, - to => Int, - value => $value_type, - ]]; -}; - -sub accessor_metaclass { 'My::Accessor' } - -after install_accessors => sub { - my ($self) = @_; - - my $class = $self->associated_class; - - for my $meth (qw(accessor reader writer predicate clearer)) { - my $check = "has_$meth"; - next unless $self->$check; - - my $type = "timed_$meth"; - my $basename = $self->$meth; - my $name = "${basename}_timed"; - - $class->add_method( - $self->_process_accessors($type => $name,0) - ); - } -}; - -use Data::Printer; - -sub _find_interval_for { - my ($self,$all_values,$when) = @_; - - my $default; - - for my $interval (@$all_values) { - if ($interval->{from}==0 and $interval->{to}==0) { - $default = $interval; - next; - } - next if $interval->{from} > $when; - next if $interval->{to} <= $when; - return $interval; - } - return $default; -} - -sub get_timed_value { - my ($self,$instance,$opts,$for_trigger) = @_; - - print join ', ',caller; - printf " get_timed_value(%s)\n",p($opts); - - my $when = $opts->{when} // $opts->{from} // time(); - - my $all_values = $self->get_value($instance,$for_trigger); - - return unless $all_values && @$all_values; - - my $interval = $self->_find_interval_for($all_values,$when); - - return unless defined $interval; - - return $interval->{value}; -} - -sub set_timed_value { - my ($self,$instance,$opts,$value) = @_; - - print join ', ',caller; - printf " set_timed_value(%s,%s)\n",p($opts),p($value); - - if ($opts->{forever}) { - $self->set_value($instance,[ - { - from => 0, - to => 0, - value => $value, - }, - ]); - } - else { - my $interval = { - from => $opts->{from}//0, - to => $opts->{to}//0, - value => $value, - }; - - # XXX this has to take into account interval intersections &c - my $all_values = $self->get_value($instance); - push @$all_values,$interval; - $self->set_value($instance,$all_values); - } -} - -sub has_timed_value { - my ($self,$instance,$opts) = @_; - - print join ', ',caller; - printf " has_timed_value(%s)\n",p($opts); - - return unless $self->has_value($instance); - - my $when = $opts->{when} // time(); - - my $all_values = $self->get_value($instance); - - return unless $all_values && @$all_values; - - return defined $self->_find_interval_for($all_values,$when); -} - -sub clear_timed_value { - my ($self,$instance,$opts) = @_; - - print join ', ',caller; - printf " clear_timed_value(%s)\n",p($opts); - - if ($opts->{forever}) { - $self->clear_value($instance); - } - # should do intersections &c - die "unimplemented"; -} -}; - -package Moose::Meta::Attribute::Custom::Trait::Timed;{ -sub register_implementation { 'My::Attribute' } -} - -package My::Accessor;{ -use base 'Moose::Meta::Method::Accessor'; -use Carp 'confess'; - -sub _instance_is_inlinable { 0 } - -sub _generate_accessor_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - if (@_ >= 2) { - $attr->set_timed_value($_[0], {forever=>1}, $_[1]); - } - $attr->get_timed_value($_[0], {when=>time()}); - } -} - -sub _generate_reader_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - confess "Cannot assign a value to a read-only accessor" - if @_ > 1; - $attr->get_timed_value($_[0], {when=>time()}); - }; -} - -sub _generate_writer_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - $attr->set_timed_value($_[0], {forever=>1}, $_[1]); - }; -} - -sub _generate_predicate_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - $attr->has_timed_value($_[0], {when=>time()}) - }; -} - -sub _generate_clearer_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - $attr->clear_timed_value($_[0], {forever=>1}) - }; -} - -sub _generate_timed_accessor_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - if (@_ >= 3) { - $attr->set_timed_value($_[0], $_[1], $_[2]); - } - $attr->get_timed_value($_[0],$_[1]); - } -} - -sub _generate_timed_reader_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - confess "Cannot assign a value to a read-only accessor" - if @_ > 2; - $attr->get_timed_value($_[0],$_[1]); - }; -} - -sub _generate_timed_writer_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - $attr->set_timed_value($_[0], $_[1], $_[2]); - }; -} - -sub _generate_timed_predicate_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - $attr->has_timed_value($_[0],$_[1]) - }; -} - -sub _generate_timed_clearer_method { - my $self = shift; - my $attr = $self->associated_attribute; - - return sub { - $attr->clear_timed_value($_[0],$_[1]) - }; -} -}; - -package Foo;{ -use Moose; -use MooseX::Types::Moose qw(Int); - -has stuff => ( - is => 'rw', - isa => Int, - traits => ['Timed'], - predicate => 'has_stuff', - clearer => 'has_stuff', -); -} - -package main;{ -use Data::Printer; -use 5.012; - -my $obj = Foo->new(); - -p $obj; - -say $obj->stuff(2); - -eval { say $obj->stuff('wrong') } or say $@; - -say $obj->stuff_timed({from=>10,to=>20},5); -say $obj->stuff_timed({},3); - -p $obj; - -say $obj->stuff(); -say $obj->stuff_timed({}); -say $obj->stuff_timed({when=>12}); - -} - -=pod - -=head1 NOTES - -we could override C<set_raw_value>, C<get_raw_value> and -C<$meta_instance->set_slot_value> (or C<set_initial_value>) on the -L<::Meta::Attribute>. - -that would take care of type constraints, while leaving us free to use -an arbitrary internal representation. - -no inlining, it's too awkward - -=head2 internal representation - -not easy… we need something like L<Array::IntSpan>, but slightly less -insane, with added tagging (we can't sensibly decouple intervals from -tags/envs, the representations would clash) - -suggestion: per each tag: - -arrayref, position 0 = default (-inf,inf) - -other elements set in asc order of start - -binary search (on start, with additional check on end) to find the -right place to read from - -split / remove elements when setting / clearing - diff --git a/Data-MultiValued/dist.ini b/dist.ini index af05b71..af05b71 100644 --- a/Data-MultiValued/dist.ini +++ b/dist.ini diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeAccessors.pm b/lib/Data/MultiValued/AttributeAccessors.pm index cac3538..cac3538 100644 --- a/Data-MultiValued/lib/Data/MultiValued/AttributeAccessors.pm +++ b/lib/Data/MultiValued/AttributeAccessors.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait.pm b/lib/Data/MultiValued/AttributeTrait.pm index 91e1b13..91e1b13 100644 --- a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait.pm +++ b/lib/Data/MultiValued/AttributeTrait.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Ranges.pm b/lib/Data/MultiValued/AttributeTrait/Ranges.pm index 8d93578..8d93578 100644 --- a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Ranges.pm +++ b/lib/Data/MultiValued/AttributeTrait/Ranges.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm b/lib/Data/MultiValued/AttributeTrait/Tags.pm index 7cffb33..7cffb33 100644 --- a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/Tags.pm +++ b/lib/Data/MultiValued/AttributeTrait/Tags.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm b/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm index e0c56cd..e0c56cd 100644 --- a/Data-MultiValued/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm +++ b/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/Exceptions.pm b/lib/Data/MultiValued/Exceptions.pm index 8d444c0..8d444c0 100644 --- a/Data-MultiValued/lib/Data/MultiValued/Exceptions.pm +++ b/lib/Data/MultiValued/Exceptions.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/RangeContainer.pm b/lib/Data/MultiValued/RangeContainer.pm index 474626f..474626f 100644 --- a/Data-MultiValued/lib/Data/MultiValued/RangeContainer.pm +++ b/lib/Data/MultiValued/RangeContainer.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/Ranges.pm b/lib/Data/MultiValued/Ranges.pm index 9c69626..9c69626 100644 --- a/Data-MultiValued/lib/Data/MultiValued/Ranges.pm +++ b/lib/Data/MultiValued/Ranges.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/TagContainer.pm b/lib/Data/MultiValued/TagContainer.pm index cdd0456..cdd0456 100644 --- a/Data-MultiValued/lib/Data/MultiValued/TagContainer.pm +++ b/lib/Data/MultiValued/TagContainer.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/TagContainerForRanges.pm b/lib/Data/MultiValued/TagContainerForRanges.pm index d3cd4b9..d3cd4b9 100644 --- a/Data-MultiValued/lib/Data/MultiValued/TagContainerForRanges.pm +++ b/lib/Data/MultiValued/TagContainerForRanges.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/Tags.pm b/lib/Data/MultiValued/Tags.pm index fbf7948..fbf7948 100644 --- a/Data-MultiValued/lib/Data/MultiValued/Tags.pm +++ b/lib/Data/MultiValued/Tags.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/TagsAndRanges.pm b/lib/Data/MultiValued/TagsAndRanges.pm index 6208435..6208435 100644 --- a/Data-MultiValued/lib/Data/MultiValued/TagsAndRanges.pm +++ b/lib/Data/MultiValued/TagsAndRanges.pm diff --git a/Data-MultiValued/lib/Data/MultiValued/UglySerializationHelperRole.pm b/lib/Data/MultiValued/UglySerializationHelperRole.pm index e586dec..e586dec 100644 --- a/Data-MultiValued/lib/Data/MultiValued/UglySerializationHelperRole.pm +++ b/lib/Data/MultiValued/UglySerializationHelperRole.pm diff --git a/Data-MultiValued/t/json.t b/t/json.t index 5e00080..5e00080 100644 --- a/Data-MultiValued/t/json.t +++ b/t/json.t diff --git a/Data-MultiValued/t/moose-ranges.t b/t/moose-ranges.t index 404e649..404e649 100644 --- a/Data-MultiValued/t/moose-ranges.t +++ b/t/moose-ranges.t diff --git a/Data-MultiValued/t/moose-tagged.t b/t/moose-tagged.t index 6e1ac7a..6e1ac7a 100644 --- a/Data-MultiValued/t/moose-tagged.t +++ b/t/moose-tagged.t diff --git a/Data-MultiValued/t/more-overlapping-ranges.t b/t/more-overlapping-ranges.t index 19e2fe5..19e2fe5 100644 --- a/Data-MultiValued/t/more-overlapping-ranges.t +++ b/t/more-overlapping-ranges.t diff --git a/Data-MultiValued/t/overlapping-ranges.t b/t/overlapping-ranges.t index 01bb98d..01bb98d 100644 --- a/Data-MultiValued/t/overlapping-ranges.t +++ b/t/overlapping-ranges.t diff --git a/Data-MultiValued/t/ranges-setting.t b/t/ranges-setting.t index b8d2a57..b8d2a57 100644 --- a/Data-MultiValued/t/ranges-setting.t +++ b/t/ranges-setting.t diff --git a/Data-MultiValued/t/simple-setting.t b/t/simple-setting.t index 9d9a9e2..9d9a9e2 100644 --- a/Data-MultiValued/t/simple-setting.t +++ b/t/simple-setting.t diff --git a/Data-MultiValued/t/tags-ranges-setting.t b/t/tags-ranges-setting.t index e25a9f1..e25a9f1 100644 --- a/Data-MultiValued/t/tags-ranges-setting.t +++ b/t/tags-ranges-setting.t diff --git a/Data-MultiValued/t/tags-setting.t b/t/tags-setting.t index 929ad3d..929ad3d 100644 --- a/Data-MultiValued/t/tags-setting.t +++ b/t/tags-setting.t |