The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Code::TidyAll::Cache;

use strict;
use warnings;

use Digest::SHA qw(sha1_hex);
use Path::Tiny qw(path);

use Moo;

our $VERSION = '0.54';

has 'cache_dir' => ( is => 'ro', required => 1 );

sub path_to_key {
    my ( $self, $key ) = @_;
    my $sig = sha1_hex($key);
    return $self->cache_dir->child( substr( $sig, 0, 1 ), "$sig.dat" );
}

sub get {
    my ( $self, $key ) = @_;

    my $file = $self->path_to_key($key);
    if ( $file->exists ) {
        return $file->slurp;
    }
    else {
        return undef;
    }
}

sub set {
    my ( $self, $key, $value ) = @_;

    my $file = $self->path_to_key($key);
    $file->parent->mkpath( { mode => 0755 } );
    $file->spew($value);

    return;
}

sub remove {
    my ( $self, $key, $value ) = @_;

    $self->path_to_key($key)->remove;

    return;
}

1;