File Coverage

blib/lib/Data/Monad/Either.pm
Criterion Covered Total %
statement 49 51 96.0
branch 10 10 100.0
condition n/a
subroutine 26 27 96.3
pod 13 13 100.0
total 98 101 97.0


line stmt bran cond sub pod time code
1             package Data::Monad::Either;
2 2     2   43485 use strict;
  2         5  
  2         54  
3 2     2   10 use warnings;
  2         4  
  2         61  
4 2     2   1433 use parent qw/Data::Monad::Base::Monad/;
  2         641  
  2         12  
5 2     2   90 use Exporter qw/import/;
  2         4  
  2         1322  
6              
7             our @EXPORT = qw/left right/;
8              
9             sub left {
10 15     15 1 17316 return bless [@_], __PACKAGE__ . '::Left';
11             }
12              
13             sub right {
14 32     32 1 3425 return bless [@_], __PACKAGE__ . '::Right';
15             }
16              
17             # from Data::Monad::Base::Monad
18              
19             sub unit {
20 0     0 1 0 my ($class, @v) = @_;
21 0         0 return right(@v);
22             }
23              
24             sub flat_map {
25 6     6 1 61 my ($self, $f) = @_;
26 6 100       20 return $self->is_left ? $self : $f->($self->value);
27             }
28              
29             # instance methods
30              
31             sub is_left {
32 9     9 1 52 my ($self) = @_;
33 9         49 return ref($self) eq __PACKAGE__ . '::Left';
34             }
35              
36             sub is_right {
37 21     21 1 70 my ($self) = @_;
38 21         84 return ref($self) eq __PACKAGE__ . '::Right';
39             }
40              
41             sub value {
42 29     29 1 43 my ($self) = @_;
43 29 100       148 return wantarray ? @$self : $self->[0];
44             }
45              
46             sub fold {
47 19     19 1 34 my ($self, $left_accum, $right_accum) = @_;
48 19 100       53 my $accum = $self->is_right ? $right_accum : $left_accum;
49 19         55 return $accum->($self->value);
50             }
51              
52             sub or_else {
53 4     4 1 9 my ($self, $else) = @_;
54             return $self->fold(
55 2     2   9 sub { return $else },
56 2     2   5 sub { return right(@_) },
57 4         25 );
58             }
59              
60             sub get_or_else {
61 6     6 1 14 my ($self, @else) = @_;
62 6 100   2   33 return $self->value_or(sub { wantarray ? @else : $else[0] });
  2         15  
63             }
64              
65             sub value_or {
66 9     9 1 16 my ($self, $or) = @_;
67             return $self->fold(
68             $or,
69 6 100   6   41 sub { return wantarray ? @_ : $_[0] },
70 9         33 );
71             }
72              
73             sub swap {
74 2     2 1 4 my ($self) = @_;
75             return $self->fold(
76 1     1   3 sub { return right(@_) },
77 1     1   3 sub { return left(@_) },
78             )
79 2         13 }
80              
81             sub left_map {
82 2     2 1 5 my ($self, $f) = @_;
83             return $self->fold(
84 1     1   4 sub { return left($f->(@_)) },
85 1     1   3 sub { return right(@_) },
86 2         14 );
87             }
88              
89             package Data::Monad::Either::Left;
90 2     2   13 use parent -norequire, 'Data::Monad::Either';
  2         3  
  2         15  
91              
92             package Data::Monad::Either::Right;
93 2     2   145 use parent -norequire, 'Data::Monad::Either';
  2         4  
  2         10  
94              
95             1;
96              
97             __END__