[libcatmandu-perl] 05/85: Extended the Fix language with do (monad)

Jonas Smedegaard dr at jones.dk
Tue May 20 09:56:14 UTC 2014


This is an automated email from the git hooks/post-receive script.

js pushed a commit to tag 0.91
in repository libcatmandu-perl.

commit 25ce81bac2fb46023b0ad8b6fabfa828f444c004
Author: Patrick Hochstenbach <patrick.hochstenbach at ugent.be>
Date:   Thu May 8 07:29:15 2014 +0200

    Extended the Fix language with do (monad)
---
 lib/Catmandu/Fix.pm               |  2 +-
 lib/Catmandu/Fix/Bind.pm          | 15 +++++++++++++++
 lib/Catmandu/Fix/Bind/identity.pm |  8 ++++++++
 lib/Catmandu/Fix/Parser.pm        | 19 +++++++++++++++++++
 4 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/lib/Catmandu/Fix.pm b/lib/Catmandu/Fix.pm
index adc9205..5d8c66c 100644
--- a/lib/Catmandu/Fix.pm
+++ b/lib/Catmandu/Fix.pm
@@ -26,7 +26,7 @@ has _captures   => (is => 'ro', lazy => 1, init_arg => undef, default => sub { +
 has var         => (is => 'ro', lazy => 1, init_arg => undef, builder => 'generate_var');
 has fixes       => (is => 'ro', required => 1, trigger => 1);
 has binds       => (is => 'ro');
-has binder      => (is => 'lazy');
+has binder      => (is => 'rw');
 has _reject     => (is => 'ro', init_arg => undef, default => sub { +{} });
 has _reject_var => (is => 'ro', lazy => 1, init_arg => undef, builder => '_build_reject_var');
 
diff --git a/lib/Catmandu/Fix/Bind.pm b/lib/Catmandu/Fix/Bind.pm
index 22fed80..6ea77ea 100644
--- a/lib/Catmandu/Fix/Bind.pm
+++ b/lib/Catmandu/Fix/Bind.pm
@@ -6,6 +6,8 @@ use namespace::clean;
 requires 'unit';
 requires 'bind';
 
+has fixes => (is => 'rw', default => sub { [] });
+
 sub unit {
 	my ($self,$data) = @_;
 	return $data;
@@ -16,6 +18,19 @@ sub bind {
 	return $code->($data);
 }
 
+sub emit {
+    my ($self, $fixer, $label) = @_;
+    my $perl = "";
+    
+    $fixer->binder([$self]);
+
+    $perl .= $fixer->emit_fixes($self->fixes);
+
+    $fixer->binder(undef);
+
+    $perl;
+}
+
 =head1 NAME
 
 Catmandu::Fix::Bind - a Binder for fixes
diff --git a/lib/Catmandu/Fix/Bind/identity.pm b/lib/Catmandu/Fix/Bind/identity.pm
new file mode 100644
index 0000000..7972ef3
--- /dev/null
+++ b/lib/Catmandu/Fix/Bind/identity.pm
@@ -0,0 +1,8 @@
+package Catmandu::Fix::Bind::identity;
+
+use Moo;
+use Data::Dumper;
+
+with 'Catmandu::Fix::Bind';
+
+1;
\ No newline at end of file
diff --git a/lib/Catmandu/Fix/Parser.pm b/lib/Catmandu/Fix/Parser.pm
index 48a87bf..9480d68 100644
--- a/lib/Catmandu/Fix/Parser.pm
+++ b/lib/Catmandu/Fix/Parser.pm
@@ -23,6 +23,7 @@ expression ::= old_if     action => ::first
              | unless     action => ::first
              | select     action => ::first
              | reject     action => ::first
+             | do         action => ::first
              | fix        action => ::first
 
 old_if ::= old_if_condition fixes ('end()') bless => IfElse
@@ -45,6 +46,10 @@ old_unless_condition ::= old_unless_name ('(') args (')') bless => OldCondition
 
 condition ::= name ('(') args (')') bless => Condition
 
+do ::= ('do') bind fixes ('end') bless => Do
+
+bind ::= name ('(') args (')') bless => Bind
+
 fix ::= name ('(') args (')') bless => Fix
 
 args ::= arg* separator => sep
@@ -159,6 +164,20 @@ sub Catmandu::Fix::Parser::OldCondition::reify {
         ->new(map { $_->reify } @$args);
 }
 
+sub Catmandu::Fix::Parser::Do::reify {
+    my $bind       = $_[0]->[0]->reify;
+    my $do_fixes   = $_[0]->[1];
+    $bind->fixes([map { $_->reify } @$do_fixes]);
+    $bind;
+}
+
+sub Catmandu::Fix::Parser::Bind::reify {
+    my $name = $_[0]->[0];
+    my $args = $_[0]->[1];
+    Catmandu::Util::require_package($name, 'Catmandu::Fix::Bind')
+        ->new(map { $_->reify } @$args);
+}
+
 sub Catmandu::Fix::Parser::DoubleQuotedString::reify {
     my $str = $_[0]->[0];
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libcatmandu-perl.git



More information about the Pkg-perl-cvs-commits mailing list