| Idempotency or Singleton Memoization |
[Jun. 18th, 2008|09:14 am] |
sub makeDoOnce {
my($sub) = @_;
my $alreadyDone = undef;
my @result = undef;
my $exception = undef;
return sub {
die $exception if $exception;
if ($alreadyDone) {return wantarray ? @result : $result[0];}
eval {
my $w = wantarray;
if (not defined $w) { $sub->(@_)}
if ($w) {@result = $sub->(@_)}
else {$result[0] = $sub->(@_)}
};
$exception = $@ if $@;
die $exception if $exception;
$alreadyDone = 1;
return wantarray ? @result : $result[0];
};
}
|
|
|