some more examples
Stevan Little [Thu, 17 Aug 2006 16:50:09 +0000 (16:50 +0000)]
examples/units/bytes.t [new file with mode: 0644]
examples/units/time.t [new file with mode: 0644]
lib/Moose/Autobox/Code.pm

diff --git a/examples/units/bytes.t b/examples/units/bytes.t
new file mode 100644 (file)
index 0000000..7ca0d88
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Moose::Autobox;
+
+{
+    package Units::Bytes;
+    use Moose::Role;
+    use Moose::Autobox;
+    
+    sub bytes     { $_[0]                   }    
+    sub kilobytes { $_[0] * 1024            }
+    sub megabytes { $_[0] * 1024->kilobytes }
+    sub gigabytes { $_[0] * 1024->megabytes }
+    sub terabytes { $_[0] * 1024->gigabytes }
+    
+    {
+        no warnings 'once'; # << squelch the stupid "used only once, maybe typo" warnings
+        *byte     = \&bytes;
+        *kilobyte = \&kilobytes;    
+        *megabyte = \&megabytes;    
+        *gigabyte = \&gigabytes;
+        *terabyte = \&terabytes;
+    }
+}
+
+{
+    package Moose::Autobox::SCALAR;
+    use Moose 'with';
+    with 'Units::Bytes';
+}
+
+$\ = "\n";
+
+print "5 kilobytes are " . 5->kilobytes . " bytes";
+print "2 megabytes are " . 2->megabytes . " bytes";
+print "1 gigabyte is "   . 1->gigabyte  . " bytes";
+print "2 terabyes are "  . 2->terabytes . " bytes";
+
diff --git a/examples/units/time.t b/examples/units/time.t
new file mode 100644 (file)
index 0000000..f04edd1
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Moose::Autobox;
+use Moose::Autobox::Undef;
+
+{
+    package Units::Time;
+    use Moose::Role;
+    use Moose::Autobox;
+    
+    sub seconds   { $_[0]               }    
+    sub minutes   { $_[0] * 60          }
+    sub hours     { $_[0] * 60->minutes }
+    sub days      { $_[0] * 24->hours   }
+    sub weeks     { $_[0] * 7->days     }
+    sub years     { $_[0] * 365->days   }
+    sub centuries { $_[0] * 10->years   } 
+    
+    sub ago {
+        my ($self, $time) = @_;
+        $time ||= time();
+        $time - $self;
+    }   
+    
+    sub since {
+        my ($self, $time) = @_;
+        $time ||= time();        
+        $time + $self;
+    }   
+    
+    {
+        no warnings 'once';
+        
+        # singular versions 
+        *second  = \&seconds;
+        *minute  = \&minutes;
+        *hour    = \&hours;
+        *day     = \&days;
+        *week    = \&weeks;
+        *year    = \&years;
+        *century = \&centuries;
+        
+        *til      = \&ago;    
+        *from_now = \&since; 
+    }
+    
+    sub as_string { scalar localtime $_[0] }
+
+}
+
+{
+    package Moose::Autobox::SCALAR;
+    use Moose 'with';
+    with 'Units::Time';
+}
+
+$\ = "\n";
+
+print "2 days ago was           : " . 2->days->ago->as_string;
+print "3 weeks from now will be : " . 3->weeks->from_now->as_string;
+my $one_week_ago = 1->week->ago;
+print "1 day until 1 week ago   : " . 1->day->til($one_week_ago)->as_string;
+print "2 years since 1 week ago : " . 2->years->since($one_week_ago)->as_string;
+
+
index e19ee54..c2e33a1 100644 (file)
@@ -32,6 +32,8 @@ sub conjoin {
        return sub { $f->(@_) && $f2->(@_) }    
 }
 
+# fixed point combinators
+
 sub u {
     my $f = shift;
     sub { $f->($f, @_) };
@@ -39,15 +41,9 @@ sub u {
 
 sub y {
     my $f = shift;
-    (sub { my $h = shift; sub { $f->(($h->u())->())->(@_) } }->u())->();
+    (sub { my $h = shift; sub { $f->(($h->u)->())->(@_) } }->u)->();
 }
 
-#sub dump {
-    #my ($self) = @_;
-    #require Data::Dump::Streamer;
-    #return Data::Dump::Streamer::Dump($self)->Out();
-#}
-
 1;
 
 __END__
@@ -124,6 +120,8 @@ This implements the U combinator.
 
 =item L<http://en.wikipedia.org/wiki/Fixed_point_combinator>
 
+=item L<http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/20469>
+
 =back
 
 =head1 BUGS