NAME

Data::Focus::Applicative - applicative functor spec for Data::Focus

DESCRIPTION

This interface is experimental for now. You should not use them directly.

This class specifies the common interface for all applicative functors used in Data::Focus distribution.

All applicative functors must inherit Data::Focus::Applicative, and implement the following methods.

ABSTRACT CLASS METHODS

$f_result = $class->build($builder, @f_parts)

Build the $f_result with $builder and @f_parts.

@f_parts are zero or more Data::Focus::Applicative objects. They must be instances of the $class. build() method is the only interface where you can access raw data wrapped inside @f_parts.

$builder is a code-ref, which may be called zero or more times

$result = $builder->(@parts)

where @parts are the data inside @f_parts applicative functors.

Return value $f_result is an object of the $class. It wraps the $result.

$f_result = $class->pure($result)

Wraps $result with an wrapper object of $class. This is equivalent to $class->build(sub { $result }).

$part_mapper = $class->create_part_mapper($updater)

Internal use only.

Create the finest $part_mapper for Data::Focus::Lens.

$updater is a code-ref. This code-ref is supposed to modify the finest part and return the result. Subclasses may or may not use $updater to create $part_mapper.

RELATIONSHIP TO HASKELL

In pseudo-Haskell, build() method is equivalent to

build :: Applicative f => (b -> b -> ... -> t) -> [f b] -> f t
build builder f_parts =
  case f_parts of
    [] -> pure builder  -- (builder :: t) in this case
    (p:ps) -> builder <$> p <*> (ps !! 0) <*> (ps !! 1) ...

I think this is the only pattern where applicative functors are used in Lens implementations.

The signature of create_part_mapper() method is

create_part_mapper :: Applicative f => (a -> b) -> (a -> f b)

AUTHOR

Toshio Ito, <toshioito at cpan.org>