The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package OpenResty::Shell::History;

use strict;
use warnings;
use YAML::Syck qw(LoadFile DumpFile);

sub new {
    my ($class, $opts) = @_;
    $opts ||= {};
    my $file = $opts->{file} or
        die "No file name given";
    my $term = $opts->{term} or
        die "No Term::ReadLine object given";
    my $count = $opts->{count} || 100;
    my $features = $term->Features;
    my $hist;
    if (-f $file) {
        $hist = LoadFile($file);
        for my $cmd (@$hist) {
            #warn $cmd;
            $term->addhistory($cmd)
                if $cmd && $cmd =~ /\w/ && $features->{autohistory};
        }
    }
    bless {
        hist => $hist || [],
        file => $file,
        features => $features,
        term => $term,
        count => $count,
    }, $class;
}

sub add_history {
    my ($self, $input) = @_;
    return unless $input && $input =~ /\w/;
    my $hist = $self->{hist};
    my $file = $self->{file};
    my $count = $self->{count};
    if (@$hist >= $count) {
        shift @$hist;
    }
    push @$hist, $input;
    my $features = $self->{features};
    $self->{term}->addhistory($input)
        if $features->{autohistory};
    DumpFile($file, $hist);
}

1;