summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGianni Ceccarelli <dakkar@thenautilus.net>2011-11-10 15:10:26 +0000
committerGianni Ceccarelli <dakkar@thenautilus.net>2011-11-10 15:10:26 +0000
commitdc07be4ac45756a0e664ee29e888f86b7609784a (patch)
treedca7e4467f73625604886e8910a609ccc978b0ce
parent'clear' almost completely implemneted (diff)
downloaddata-multivalued-dc07be4ac45756a0e664ee29e888f86b7609784a.tar.gz
data-multivalued-dc07be4ac45756a0e664ee29e888f86b7609784a.tar.bz2
data-multivalued-dc07be4ac45756a0e664ee29e888f86b7609784a.zip
move up a level
-rw-r--r--.gitignore10
-rw-r--r--Changes (renamed from Data-MultiValued/Changes)0
-rw-r--r--Data-MultiValued/.gitignore13
-rw-r--r--attr.pl363
-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
diff --git a/.gitignore b/.gitignore
index 68f70d8..a916a46 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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