#
# This file is part of Text-Levenshtein-XS
#
# This software is copyright (c) 2016 by Nick Logan.
#
# This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#
package Text::Levenshtein::XS;

use 5.008;
use strict;
use warnings FATAL => 'all';
require Exporter;

@Text::Levenshtein::XS::ISA       = qw/Exporter/;
@Text::Levenshtein::XS::EXPORT_OK = qw/distance/;
$Text::Levenshtein::XS::VERSION   = 0.503;

eval {
    require XSLoader;
    XSLoader::load(__PACKAGE__, $Text::Levenshtein::XS::VERSION);
    1;
} or do {
    require DynaLoader;
    DynaLoader::bootstrap(__PACKAGE__, $Text::Levenshtein::XS::VERSION);
    sub dl_load_flags {0} # Prevent DynaLoader from complaining and croaking
};



sub distance {
    return Text::Levenshtein::XS::xs_distance( [unpack('U*', shift)], [unpack('U*', shift)], shift || 0);
}



1;

=pod

=encoding UTF-8

=head1 NAME

Text::Levenshtein::XS - Calculate edit distance based on insertion, deletion, and substitution

=head1 VERSION

version 0.503

=head1 SYNOPSIS

    use Text::Levenshtein::XS qw/distance/;

    print distance('Neil','Niel');
    # prints 2

=head1 DESCRIPTION

Returns the number of edits (insert,delete,substitute) required to turn the source string into the target string. XS implementation (requires a C compiler). Works correctly with utf8.

    use Text::Levenshtein::XS qw/distance/;
    use utf8;

    distance('ⓕⓞⓤⓡ','ⓕⓤⓞⓡ'), 
    # prints 2

=for Pod::Coverage dl_load_flags xs_distance

=head1 METHODS

=head2 distance

=over 4

=item Arguments: $source_text, $target_text, (optional) $max_distance

=item Return Value: Int $edit_distance || undef (if max_distance is exceeded)

=back

Returns: int that represents the edit distance between the two argument, or undef if $max_distance threshold is exceeded.

Takes the edit distance between a source and target string using XS 2 vector implementation.

    use Text::Levenshtein::XS qw/distance/;
    print distance('Neil','Niel');
    # prints 2

Stops calculations and returns undef if $max_distance is set, non-zero (0 = no limit), and the algorithm has determined the final distance will be greater than $max_distance.

    my $distance = distance('Neil','Niel',1);
    print (defined $distance) ? $distance : "Exceeded max distance";
    # prints "Exceeded max distance"

=head1 NOTES

Drop in replacement for L<Text::LevenshteinXS>

=head1 SEE ALSO

=over 4

=item * L<Text::Levenshtein::Damerau>

=item * L<Text::Levenshtein::Damerau::PP>

=item * L<Text::Levenshtein::Damerau::XS>

=item * L<Text::Fuzzy>

=item * L<Text::Levenshtein::Flexible>

=back

=head1 REPOSITORY

L<https://github.com/ugexe/Text--Levenshtein--XS>

=for HTML <a href="https://travis-ci.org/ugexe/Text--Levenshtein--XS?branch=release"><img src="https://travis-ci.org/ugexe/Text--Levenshtein--XS.svg?branch=release"></a>
    <a href='https://coveralls.io/r/ugexe/Text--Levenshtein--XS?branch=release'><img src='https://coveralls.io/repos/ugexe/Text--Levenshtein--XS/badge.png?branch=release' alt='Coverage Status' /></a>

=head1 BUGS

Please report bugs to:

L<https://github.com/ugexe/Text--Levenshtein--XS/issues>

=head1 AUTHOR

ugexe <ugexe@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2016 by Nick Logan.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

__END__



# ABSTRACT: Calculate edit distance based on insertion, deletion, and substitution