{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE Safe #-}
module Text.EditDistance (
Costs(..), EditCosts(..), defaultEditCosts,
levenshteinDistance, restrictedDamerauLevenshteinDistance
) where
import Text.EditDistance.EditCosts
import qualified Text.EditDistance.Bits as Bits
import qualified Text.EditDistance.SquareSTUArray as SquareSTUArray
levenshteinDistance :: EditCosts -> String -> String -> Int
levenshteinDistance :: EditCosts -> String -> String -> Int
levenshteinDistance EditCosts
costs String
str1 String
str2
| EditCosts -> Bool
isDefaultEditCosts EditCosts
costs
, (Int
str1_len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
64) Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== (Int
str2_len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
64)
= Int -> Int -> String -> String -> Int
Bits.levenshteinDistanceWithLengths Int
str1_len Int
str2_len String
str1 String
str2
| Bool
otherwise
= EditCosts -> Int -> Int -> String -> String -> Int
SquareSTUArray.levenshteinDistanceWithLengths EditCosts
costs Int
str1_len Int
str2_len String
str1 String
str2
where
str1_len :: Int
str1_len = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
str1
str2_len :: Int
str2_len = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
str2
restrictedDamerauLevenshteinDistance :: EditCosts -> String -> String -> Int
restrictedDamerauLevenshteinDistance :: EditCosts -> String -> String -> Int
restrictedDamerauLevenshteinDistance EditCosts
costs String
str1 String
str2
| EditCosts -> Bool
isDefaultEditCosts EditCosts
costs
, (Int
str1_len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
64) Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
== (Int
str2_len Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
64)
= Int -> Int -> String -> String -> Int
Bits.restrictedDamerauLevenshteinDistanceWithLengths Int
str1_len Int
str2_len String
str1 String
str2
| Bool
otherwise
= EditCosts -> Int -> Int -> String -> String -> Int
SquareSTUArray.restrictedDamerauLevenshteinDistanceWithLengths EditCosts
costs Int
str1_len Int
str2_len String
str1 String
str2
where
str1_len :: Int
str1_len = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
str1
str2_len :: Int
str2_len = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
str2