The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Do not edit this file - Generated by Perlito 7.0
use v5;
use utf8;
use strict;
use warnings;
no warnings ('redefine', 'once', 'void', 'uninitialized', 'misc', 'recursion');
use Perlito::Perl5::Runtime;
use Perlito::Perl5::Prelude;
our $MATCH = Perlito::Match->new();
{
package GLOBAL;
    sub new { shift; bless { @_ }, "GLOBAL" }

    # use v6 
;
    {
    package Lit::Array;
        sub new { shift; bless { @_ }, "Lit::Array" }
        sub array1 { $_[0]->{array1} };
        sub expand_interpolation {
            my $self = $_[0];
            ((my  $needs_interpolation) = 0);
            (my  $List_items = bless [], 'ARRAY');
            for my $item ( @{$self->{array1}} ) {
                if ((Main::isa($item, 'Apply') && ((($item->code() eq 'circumfix:<( )>') || ($item->code() eq 'list:<,>'))))) {
                    for my $arg ( @{(($item->arguments()))} ) {
                        push( @{$List_items}, $arg )
                    }
                }
                else {
                    push( @{$List_items}, $item )
                }
            };
            for my $item ( @{$List_items} ) {
                if (((Main::isa($item, 'Var') && ($item->sigil() eq chr(64))) || (Main::isa($item, 'Apply') && ((($item->code() eq 'prefix:<' . chr(64) . '>') || ($item->code() eq 'infix:<..>')))))) {
                    ($needs_interpolation = 1)
                }
            };
            if (($needs_interpolation && (scalar( @{$List_items} ) == 1))) {
                return scalar ($List_items->[0])
            };
            (my  $List_s = bless [], 'ARRAY');
            for my $item ( @{$List_items} ) {
                if (((Main::isa($item, 'Var') && ($item->sigil() eq chr(64))) || (Main::isa($item, 'Apply') && ((($item->code() eq 'prefix:<' . chr(64) . '>') || ($item->code() eq 'infix:<..>')))))) {
                    push( @{$List_s}, Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Var->new(('name' => 'v'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => '')) );
    push( @{$List_a}, $item );
    $List_a
}), ('code' => 'infix:<' . chr(61) . '>'), ('namespace' => '')) );
                    push( @{$List_s}, For->new(('body' => Lit::Block->new(('sig' => Var->new(('name' => 'x'), ('namespace' => ''), ('sigil' => chr(36)), ('twigil' => ''))), ('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Call->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Index->new(('index_exp' => Var->new(('name' => 'x'), ('namespace' => ''), ('sigil' => chr(36)), ('twigil' => ''))), ('obj' => Var->new(('name' => 'v'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => '')))) );
    $List_a
}), ('hyper' => ''), ('invocant' => Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => ''))), ('method' => 'push')) );
    $List_a
}))), ('cond' => Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Val::Int->new(('int' => 0)) );
    push( @{$List_a}, Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Call->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    $List_a
}), ('hyper' => ''), ('invocant' => Var->new(('name' => 'v'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => ''))), ('method' => 'elems')) );
    push( @{$List_a}, Val::Int->new(('int' => 1)) );
    $List_a
}), ('code' => 'infix:<->'), ('namespace' => '')) );
    $List_a
}), ('code' => 'circumfix:<( )>'), ('namespace' => '')) );
    $List_a
}), ('code' => 'infix:<..>'), ('namespace' => ''))), ('topic' => undef())) )
                }
                else {
                    push( @{$List_s}, Call->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $item );
    $List_a
}), ('hyper' => ''), ('invocant' => Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => ''))), ('method' => 'push')) )
                }
            };
            return scalar (Do->new(('block' => Lit::Block->new(('sig' => undef()), ('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Decl->new(('decl' => 'my'), ('type' => ''), ('var' => Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => '')))) );
    push( @{$List_a}, Decl->new(('decl' => 'my'), ('type' => ''), ('var' => Var->new(('name' => 'v'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => '')))) );
    ($List_v = $List_s);
    for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
        push( @{$List_a}, $List_v->[$x] )
    };
    push( @{$List_a}, Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(64)), ('twigil' => '')) );
    $List_a
})))))
        }
    }

;
    {
    package Lit::Hash;
        sub new { shift; bless { @_ }, "Lit::Hash" }
        sub hash1 { $_[0]->{hash1} };
        sub expand_interpolation {
            my $self = $_[0];
            (my  $List_items = bless [], 'ARRAY');
            for my $item ( @{$self->{hash1}} ) {
                if ((Main::isa($item, 'Apply') && ((($item->code() eq 'circumfix:<( )>') || ($item->code() eq 'list:<,>'))))) {
                    for my $arg ( @{(($item->arguments()))} ) {
                        push( @{$List_items}, $arg )
                    }
                }
                else {
                    push( @{$List_items}, $item )
                }
            };
            (my  $List_s = bless [], 'ARRAY');
            for my $item ( @{$List_items} ) {
                if ((Main::isa($item, 'Apply') && ($item->code() eq 'infix:<' . chr(61) . '>>'))) {
                    push( @{$List_s}, Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Lookup->new(('index_exp' => $item->arguments()->[0]), ('obj' => Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(37)), ('twigil' => '')))) );
    push( @{$List_a}, $item->arguments()->[1] );
    $List_a
}), ('code' => 'infix:<' . chr(61) . '>'), ('namespace' => '')) )
                }
                else {
                    if (((Main::isa($item, 'Var') && ($item->sigil() eq chr(37))) || (Main::isa($item, 'Apply') && ($item->code() eq 'prefix:<' . chr(37) . '>')))) {
                        push( @{$List_s}, For->new(('body' => Lit::Block->new(('sig' => Var->new(('name' => 'p'), ('namespace' => ''), ('sigil' => chr(36)), ('twigil' => ''))), ('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Lookup->new(('index_exp' => Call->new(('arguments' => undef()), ('hyper' => ''), ('invocant' => Var->new(('name' => 'p'), ('namespace' => ''), ('sigil' => chr(36)), ('twigil' => ''))), ('method' => 'key'))), ('obj' => Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(37)), ('twigil' => '')))) );
    push( @{$List_a}, Call->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    $List_a
}), ('hyper' => ''), ('invocant' => Var->new(('name' => 'p'), ('namespace' => ''), ('sigil' => chr(36)), ('twigil' => ''))), ('method' => 'value')) );
    $List_a
}), ('code' => 'infix:<' . chr(61) . '>'), ('namespace' => '')) );
    $List_a
}))), ('cond' => Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Apply->new(('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Call->new(('arguments' => undef()), ('hyper' => ''), ('invocant' => $item), ('method' => 'pairs')) );
    $List_a
}), ('code' => 'circumfix:<( )>'), ('namespace' => '')) );
    $List_a
}), ('code' => 'prefix:<' . chr(64) . '>'), ('namespace' => ''))), ('topic' => undef())) )
                    }
                    else {
                        die('Error in hash composer: ', Main::perl($item, ))
                    }
                }
            };
            return scalar (Do->new(('block' => Lit::Block->new(('sig' => undef()), ('stmts' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, Decl->new(('decl' => 'my'), ('type' => ''), ('var' => Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(37)), ('twigil' => '')))) );
    ($List_v = $List_s);
    for my $x ( @{(bless [0 .. ((scalar( @{$List_v} ) - 1))], 'ARRAY')} ) {
        push( @{$List_a}, $List_v->[$x] )
    };
    push( @{$List_a}, Var->new(('name' => 'a'), ('namespace' => ''), ('sigil' => chr(37)), ('twigil' => '')) );
    $List_a
})))))
        }
    }

;
    {
    package Apply;
        sub new { shift; bless { @_ }, "Apply" }
        ((my  $Hash_op = bless {}, 'HASH') = do {
    (my  $Hash_a = bless {}, 'HASH');
    ($Hash_a->{'infix:<+' . chr(61) . '>'} = 'infix:<+>');
    ($Hash_a->{'infix:<-' . chr(61) . '>'} = 'infix:<->');
    ($Hash_a->{'infix:<*' . chr(61) . '>'} = 'infix:<*>');
    ($Hash_a->{'infix:<' . chr(47) . chr(61) . '>'} = 'infix:<' . chr(47) . '>');
    ($Hash_a->{'infix:<' . chr(124) . chr(124) . chr(61) . '>'} = 'infix:<' . chr(124) . chr(124) . '>');
    ($Hash_a->{'infix:<' . chr(38) . chr(38) . chr(61) . '>'} = 'infix:<' . chr(38) . chr(38) . '>');
    ($Hash_a->{'infix:<' . chr(124) . chr(61) . '>'} = 'infix:<' . chr(124) . '>');
    ($Hash_a->{'infix:<' . chr(38) . chr(61) . '>'} = 'infix:<' . chr(38) . '>');
    ($Hash_a->{'infix:<' . chr(47) . chr(47) . chr(61) . '>'} = 'infix:<' . chr(47) . chr(47) . '>');
    ($Hash_a->{'infix:<' . chr(126) . chr(61) . '>'} = 'list:<' . chr(126) . '>');
    $Hash_a
});
        sub op_assign {
            my $self = $_[0];
            ((my  $code) = $self->{code});
            if (Main::isa($code, 'Str')) {

            }
            else {
                return scalar (0)
            };
            if (exists($Hash_op->{$code})) {
                return scalar (Apply->new(('code' => 'infix:<' . chr(61) . '>'), ('arguments' => do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $self->{arguments}->[0] );
    push( @{$List_a}, Apply->new(('code' => $Hash_op->{$code}), ('arguments' => $self->{arguments})) );
    $List_a
})))
            };
            return scalar (0)
        }
    }

;
    {
    package Do;
        sub new { shift; bless { @_ }, "Do" }
        sub simplify {
            my $self = $_[0];
            (my  $block);
            if (Main::isa($self->{block}, 'Lit::Block')) {
                ($block = $self->{block}->stmts())
            }
            else {
                ($block = do {
    (my  $List_a = bless [], 'ARRAY');
    (my  $List_v = bless [], 'ARRAY');
    push( @{$List_a}, $self->{block} );
    $List_a
})
            };
            if ((scalar( @{$block} ) == 1)) {
                ((my  $stmt) = $block->[0]);
                if ((Main::isa($stmt, 'Apply') && ($stmt->code() eq 'circumfix:<( )>'))) {
                    ((my  $args) = $stmt->arguments());
                    return scalar (Do->new(('block' => $args->[0]))->simplify())
                };
                if (Main::isa($stmt, 'Do')) {
                    return scalar ($stmt->simplify())
                }
            };
            return scalar (Do->new(('block' => $block)))
        }
    }


}

1;