use List::Util ();
+use LaTeX::TikZ::Scope;
+
+use LaTeX::TikZ::Interface;
+use LaTeX::TikZ::Functor;
+
use Any::Moose;
use Any::Moose 'Util::TypeConstraints'
=> [ qw/subtype as where find_type_constraint/ ];
=> where {
$_->does('LaTeX::TikZ::Set::Op')
or $_->isa('LaTeX::TikZ::Set::Sequence')
- or $_->isa('LaTeX::TikZ::Set::Mod')
};
has '_kids' => (
sub draw {
my $set = shift;
- List::Util::reduce { $a . $b } map $_->draw(@_), $set->kids;
+ List::Util::reduce { LaTeX::TikZ::Scope::fold($a, $b) }
+ map $_->draw(@_),
+ $set->kids;
}
-use LaTeX::TikZ::API seq => sub {
- shift;
+LaTeX::TikZ::Interface->register(
+ seq => sub {
+ shift;
- die 'wut' if $_[0]->isa('LaTeX::TikZ::Set::Op');
+ __PACKAGE__->new(kids => \@_);
+ },
+);
- __PACKAGE__->new(kids => \@_);
-};
+LaTeX::TikZ::Functor->default_rule(
+ (__PACKAGE__) => sub {
+ my ($functor, $set, @args) = @_;
+ $set->new(kids => [ map $_->$functor(@args), $set->kids ])
+ }
+);
__PACKAGE__->meta->make_immutable;