#!/usr/bin/env perl

use v5.18;
use warnings;

use App::p5find qw<p5_doc_iterator>;

my %idx;

my @paths = @ARGV;
@paths = ('.') unless @paths;

my $iter = p5_doc_iterator(@paths);
while (my $doc = $iter->()) {
    my $file = $doc->filename;
    say "... $file";
    my $o;

    $o = $doc->find(sub { $_[1]->isa("PPI::Token::QuoteLike::Words") }) ||[];
    for my $token (@$o) {
        for my $word ($token->literal) {
            if (defined($idx{"$word"})) {
                $idx{"$word"}{frequency}++;
            } else {
                $idx{"$word"} = +{
                    frequency => 1,
                    WHERE => [
                        $file,
                        $token->line_number,
                        $token->column_number,
                    ]
                };
            }
        }
    }

    $o = $doc->find(sub { $_[1]->isa("PPI::Token::Word") }) ||[];
    for my $token (@$o) {
        if (defined($idx{"$token"})) {
            $idx{"$token"}{frequency}++;
        } else {
            $idx{"$token"} = +{
                frequency => 1,
                WHERE => [
                    $file,
                    $token->line_number,
                    $token->column_number,
                ]
            };
        }
    }
}

for my $tok (keys %idx) {
    next unless $idx{$tok}{frequency} == 1;
    say join ":", @{$idx{$tok}{WHERE}}, $tok;
}
