++ed by:
DELON RPAVLOV JGAMBLE

3 PAUSE users
1 non-PAUSE user.

Author image Christian Jaeger
and 1 contributors

NAME

FP::Abstract::Equal - equality protocol

SYNOPSIS

    package FPEqualExample::Foo {
        sub new { my $class = shift; bless [@_], $class }
        sub FP_Equal_equal {
            my ($a, $b) = @_;
            # If you know you've got numbers in here only:
            $$a[0] == $$b[0]
            # For generic values, you would instead:
            #use FP::Equal;
            #equal($$a[0], $$b[0])
        }
    }

    use FP::Equal qw(equal); use FP::List;

    ok equal( list(10,20,30)->map
                  (sub{ equal(FPEqualExample::Foo->new(20),
                              FPEqualExample::Foo->new($_[0])) }),
              list('', 1, ''));

DESCRIPTION

Objects implementing this protocol can be compared using the functions from FP::Equal, primarily equal.

The equal function forces promises before doing further comparisons or passing them to the FP_Equal_equal method (only the immediate layer, not deeply). FP_Equal_equal is only ever called with the two arguments (self and one method argument) being references of, currently, the same type (equal handles the other cases internally) (TODO: how to handle subtypes?). In better(?) words, FP_Equal_equal implementations can rely on the second argument supporting the same operations that the first one does (TODO: even into the future once accepting subtyping? This is *alpha*.) Likewise, FP_Equal_equal is not called if the arguments are both the same reference (in this case equal simply returns true).

TODO

Handle circular data structures.

SEE ALSO

FP::Equal

NOTE

This is alpha software! Read the status section in the package README or on the website.