NAME
FP::PureArray
SYNOPSIS
use
FP::PureArray;
my
$a
= purearray(1,4,5)->
map
(\
&inc
);
is
$a
->sum, 13;
# can't mutate it:
like( (
eval
{
$a
->[0]++; 1 } || $@),
qr/^Modification of a read-only value attempted/
);
like( (
eval
{
push
@$a
, 123; 1 } || $@),
qr/^Modification of a read-only value attempted/
);
is
$a
->sum, 13;
my
$b
=
$a
->unsafe_mutable;
# efficient but dangerous!
$$b
[0]++;
is
$a
->sum, 14;
# said it was dangerous!
is
ref
(
$a
),
'FP::_::MutableArray'
;
# see FP::MutableArray
is( FP::_::PureArray->null == FP::_::PureArray->null, 1);
DESCRIPTION
Perl arrays blessed into the `FP::PureArray` package, inheriting from `FP::Abstract::Pure`, and coming with the functions from `FP::Array` as methods.
If you hand someone an FP::PureArray you guarantee that you won't mutate it. This might be enforced in the future by making them immutable (todo).
PURITY
`PureArray`s are created to be immutable by default, which enforces the functional purity of the API. This can be disabled by setting `$FP::PureArray::immutable` to false when creating them. Only ever use this during development, if at all. If you need to have efficient updates, use another data structure (FP::List suits many cases, or the to-be written FP::Vec, although at that point updates directly on PureArray may be implemented efficiently, too). Or if you're sure making a PureArray mutable again is safe, you can call the `unsafe_mutable` method. Should lexical analysis get implemented in Perl at some point, a method `mutable` could be offered that safely (by way of checking via the reference count that there are no other users) turns a PureArray back into a mutable array.
PureArray implements `FP::Abstract::Pure` (`is_pure` from `FP::Predicates` returns true even if instances were made mutable via setting `$FP::PureArray::immutable`). Values returned from `unsafe_mutable` are in a different class which does *not* implement `FP::Abstract::Pure`.
TODO
Create alternative implementation that is efficient for updates on big arrays (perhaps to be called FP::Vec, but to be interoperable).
SEE ALSO
Implements: FP::Abstract::Pure, FP::Abstract::Sequence, FP::Abstract::Equal, FP::Abstract::Show
NOTE
This is alpha software! Read the status section in the package README or on the website.