Algorithm-Loops
view release on metacpan or search on metacpan
lib/Algorithm/Loops.pm view on Meta::CPAN
47484950515253545556575859606162636465666768697071727374757677787980
}
while
(
$sub
=~ /^_/ );
&&
defined
&Carp::croak
) {
unshift
@_
,
"$sub: "
;
goto
&Carp::croak
;
}
die
"$sub: "
,
@_
,
".\n"
;
}
sub
Filter(&@)
{
my
(
$code
,
@vals
)=
@_
;
isa(
$code
,
"CODE"
) or _Croak(
"No code reference given"
);
# local( $_ ); # Done by the loop.
for
(
@vals
) {
$code
->();
}
wantarray
?
@vals
:
join
""
,
@vals
;
}
sub
MapCarE(&@)
{
my
$sub
=
shift
(
@_
);
isa(
$sub
,
"CODE"
) or _Croak(
"No code reference given"
);
my
$size
= -1;
for
my
$av
(
@_
) {
isa(
$av
,
"ARRAY"
) or _Croak(
"Not an array reference ("
, _Type(
$av
),
")"
);
if
(
$size
< 0 ) {
$size
=
@$av
;
lib/Algorithm/Loops.pm view on Meta::CPAN
84858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
}
}
my
@ret
;
for
(
my
$i
= 0;
$i
<
$size
;
$i
++ ) {
push
@ret
,
&$sub
(
map
{
$_
->[
$i
] }
@_
);
}
return
wantarray
?
@ret
: \
@ret
;
}
sub
MapCarMin(&@)
{
my
$sub
=
shift
(
@_
);
isa(
$sub
,
"CODE"
) or _Croak(
"No code reference given"
);
my
$min
= -1;
for
my
$av
(
@_
) {
isa(
$av
,
"ARRAY"
) or _Croak(
"Not an array reference ("
, _Type(
$av
),
")"
);
$min
=
@$av
if
$min
< 0 ||
@$av
<
$min
;
}
my
@ret
;
for
(
my
$i
= 0;
$i
<
$min
;
$i
++ ) {
push
@ret
,
&$sub
(
map
{
$_
->[
$i
] }
@_
);
}
return
wantarray
?
@ret
: \
@ret
;
}
sub
MapCarU(&@)
{
my
$sub
=
shift
(
@_
);
isa(
$sub
,
"CODE"
) or _Croak(
"No code reference given"
);
my
$max
= 0;
for
my
$av
(
@_
) {
isa(
$av
,
"ARRAY"
) or _Croak(
"Not an array reference ("
, _Type(
$av
),
")"
);
$max
=
@$av
if
$max
<
@$av
;
}
my
@ret
;
for
(
my
$i
= 0;
$i
<
$max
;
$i
++ ) {
push
@ret
,
&$sub
(
map
{
$_
->[
$i
] }
@_
);
}
return
wantarray
?
@ret
: \
@ret
;
}
sub
MapCar(&@)
{
my
$sub
=
shift
(
@_
);
isa(
$sub
,
"CODE"
) or _Croak(
"No code reference given"
);
my
$max
= 0;
for
my
$av
(
@_
) {
isa(
$av
,
"ARRAY"
) or _Croak(
"Not an array reference ("
, _Type(
$av
),
")"
);
$max
=
@$av
if
$max
<
@$av
;
}
my
@ret
;
for
(
my
$i
= 0;
$i
<
$max
;
$i
++ ) {
push
@ret
,
&$sub
(
map
{
$i
<
@$_
?
$_
->[
$i
] : () }
@_
);
# If we assumed Want.pm, we could consider an early return.
}
return
wantarray
?
@ret
: \
@ret
;
}
sub
NextPermute(\@)
{
my
(
$vals
)=
@_
;
my
$last
= $
#{$vals};
return
!1
if
$last
< 1;
# Find last item not in reverse-sorted order:
my
$i
=
$last
-1;
$i
--
while
0 <=
$i
&&
$vals
->[
$i
] ge
$vals
->[
$i
+1];
# If complete reverse sort, we are done!
if
( -1 ==
$i
) {
# Reset to starting/sorted order:
lib/Algorithm/Loops.pm view on Meta::CPAN
168169170171172173174175176177178179180181182183184185186187188
if
$vals
->[
$i
+1] gt
$vals
->[
$last
];
# Find next item that will make us "greater":
my
$j
=
$i
+1;
$j
++
while
$vals
->[
$i
] ge
$vals
->[
$j
];
# Swap:
@{
$vals
}[
$i
,
$j
]= @{
$vals
}[
$j
,
$i
];
return
1;
}
sub
NextPermuteNum(\@)
{
my
(
$vals
)=
@_
;
my
$last
= $
#{$vals};
return
!1
if
$last
< 1;
# Find last item not in reverse-sorted order:
my
$i
=
$last
-1;
$i
--
while
0 <=
$i
&&
$vals
->[
$i
+1] <=
$vals
->[
$i
];
# If complete reverse sort, we are done!
if
( -1 ==
$i
) {
# Reset to starting/sorted order:
( run in 0.623 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )