{-# LANGUAGE RecordWildCards #-}
module Data.FuzzySet.Simple
(
FuzzySet
, FuzzyMatch
, emptySet
, defaultSet
, fromList
, addToSet
, add
, addManyToSet
, addMany
, (>+<)
, findMin
, findOneMin
, closestMatchMin
, find
, findOne
, closestMatch
, values
, size
, isEmpty
) where
import Data.FuzzySet.Internal
( FuzzySet(..)
, FuzzyMatch
, addMany_
, add_
, getMatches
)
import Control.Monad.State (runState)
import Data.Text (Text)
import Data.Maybe (fromMaybe)
import Data.HashMap.Strict (elems, lookup)
import Data.FuzzySet.Utils (safeHead, (<$$>), (<$$$>))
import Data.Function ((&))
import qualified Data.Text as Text
import qualified Data.Foldable as Foldable
import Prelude hiding (lookup)
emptySet
:: Int
-> Int
-> Bool
-> FuzzySet
emptySet :: Int -> Int -> Bool -> FuzzySet
emptySet = HashMap Text Text
-> HashMap Text [GramInfo]
-> HashMap Int (Vector FuzzySetItem)
-> Int
-> Int
-> Bool
-> FuzzySet
FuzzySet HashMap Text Text
forall a. Monoid a => a
mempty HashMap Text [GramInfo]
forall a. Monoid a => a
mempty HashMap Int (Vector FuzzySetItem)
forall a. Monoid a => a
mempty
defaultSet :: FuzzySet
defaultSet :: FuzzySet
defaultSet = Int -> Int -> Bool -> FuzzySet
emptySet Int
2 Int
3 Bool
True
findMin
:: Double
-> Text
-> FuzzySet
-> [FuzzyMatch]
findMin :: Double -> Text -> FuzzySet -> [FuzzyMatch]
findMin Double
minScore Text
str FuzzySet{Bool
Int
HashMap Int (Vector FuzzySetItem)
HashMap Text [GramInfo]
HashMap Text Text
exactSet :: HashMap Text Text
matchDict :: HashMap Text [GramInfo]
items :: HashMap Int (Vector FuzzySetItem)
gramSizeLower :: Int
gramSizeUpper :: Int
useLevenshtein :: Bool
exactSet :: FuzzySet -> HashMap Text Text
matchDict :: FuzzySet -> HashMap Text [GramInfo]
items :: FuzzySet -> HashMap Int (Vector FuzzySetItem)
gramSizeLower :: FuzzySet -> Int
gramSizeUpper :: FuzzySet -> Int
useLevenshtein :: FuzzySet -> Bool
..} =
case Text
key Text -> HashMap Text Text -> Maybe Text
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
`lookup` HashMap Text Text
exactSet of
Just Text
exactMatch ->
[(Double
1, Text
exactMatch)]
Maybe Text
Nothing ->
[Int
gramSizeUpper, Int
gramSizeUpper Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 .. Int
gramSizeLower]
[Int] -> ([Int] -> [[FuzzyMatch]]) -> [[FuzzyMatch]]
forall a b. a -> (a -> b) -> b
& (Int -> [FuzzyMatch]) -> [Int] -> [[FuzzyMatch]]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (FuzzySet -> Text -> Double -> Int -> [FuzzyMatch]
getMatches FuzzySet{Bool
Int
HashMap Int (Vector FuzzySetItem)
HashMap Text [GramInfo]
HashMap Text Text
exactSet :: HashMap Text Text
matchDict :: HashMap Text [GramInfo]
items :: HashMap Int (Vector FuzzySetItem)
gramSizeLower :: Int
gramSizeUpper :: Int
useLevenshtein :: Bool
exactSet :: HashMap Text Text
matchDict :: HashMap Text [GramInfo]
items :: HashMap Int (Vector FuzzySetItem)
gramSizeLower :: Int
gramSizeUpper :: Int
useLevenshtein :: Bool
..} Text
key Double
minScore)
[[FuzzyMatch]]
-> ([[FuzzyMatch]] -> Maybe [FuzzyMatch]) -> Maybe [FuzzyMatch]
forall a b. a -> (a -> b) -> b
& ([FuzzyMatch] -> Bool) -> [[FuzzyMatch]] -> Maybe [FuzzyMatch]
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
Foldable.find (Bool -> Bool
not (Bool -> Bool) -> ([FuzzyMatch] -> Bool) -> [FuzzyMatch] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [FuzzyMatch] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null)
Maybe [FuzzyMatch]
-> (Maybe [FuzzyMatch] -> [FuzzyMatch]) -> [FuzzyMatch]
forall a b. a -> (a -> b) -> b
& [FuzzyMatch] -> Maybe [FuzzyMatch] -> [FuzzyMatch]
forall a. a -> Maybe a -> a
fromMaybe []
where
key :: Text
key = Text -> Text
Text.toLower Text
str
findOneMin
:: Double
-> Text
-> FuzzySet
-> Maybe FuzzyMatch
findOneMin :: Double -> Text -> FuzzySet -> Maybe FuzzyMatch
findOneMin = [FuzzyMatch] -> Maybe FuzzyMatch
forall a. [a] -> Maybe a
safeHead ([FuzzyMatch] -> Maybe FuzzyMatch)
-> (Double -> Text -> FuzzySet -> [FuzzyMatch])
-> Double
-> Text
-> FuzzySet
-> Maybe FuzzyMatch
forall (f :: * -> *) (g :: * -> *) (h :: * -> *) a b.
(Functor f, Functor g, Functor h) =>
(a -> b) -> f (g (h a)) -> f (g (h b))
<$$$> Double -> Text -> FuzzySet -> [FuzzyMatch]
findMin
closestMatchMin
:: Double
-> Text
-> FuzzySet
-> Maybe Text
closestMatchMin :: Double -> Text -> FuzzySet -> Maybe Text
closestMatchMin = (FuzzyMatch -> Text) -> Maybe FuzzyMatch -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap FuzzyMatch -> Text
forall a b. (a, b) -> b
snd (Maybe FuzzyMatch -> Maybe Text)
-> (Double -> Text -> FuzzySet -> Maybe FuzzyMatch)
-> Double
-> Text
-> FuzzySet
-> Maybe Text
forall (f :: * -> *) (g :: * -> *) (h :: * -> *) a b.
(Functor f, Functor g, Functor h) =>
(a -> b) -> f (g (h a)) -> f (g (h b))
<$$$> Double -> Text -> FuzzySet -> Maybe FuzzyMatch
findOneMin
find
:: Text
-> FuzzySet
-> [FuzzyMatch]
find :: Text -> FuzzySet -> [FuzzyMatch]
find = Double -> Text -> FuzzySet -> [FuzzyMatch]
findMin Double
0.33
findOne
:: Text
-> FuzzySet
-> Maybe FuzzyMatch
findOne :: Text -> FuzzySet -> Maybe FuzzyMatch
findOne = Double -> Text -> FuzzySet -> Maybe FuzzyMatch
findOneMin Double
0.33
closestMatch
:: Text
-> FuzzySet
-> Maybe Text
closestMatch :: Text -> FuzzySet -> Maybe Text
closestMatch = (FuzzyMatch -> Text) -> Maybe FuzzyMatch -> Maybe Text
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap FuzzyMatch -> Text
forall a b. (a, b) -> b
snd (Maybe FuzzyMatch -> Maybe Text)
-> (Text -> FuzzySet -> Maybe FuzzyMatch)
-> Text
-> FuzzySet
-> Maybe Text
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> Text -> FuzzySet -> Maybe FuzzyMatch
findOne
addToSet
:: Text
-> FuzzySet
-> (Bool, FuzzySet)
addToSet :: Text -> FuzzySet -> (Bool, FuzzySet)
addToSet = State FuzzySet Bool -> FuzzySet -> (Bool, FuzzySet)
forall s a. State s a -> s -> (a, s)
runState (State FuzzySet Bool -> FuzzySet -> (Bool, FuzzySet))
-> (Text -> State FuzzySet Bool)
-> Text
-> FuzzySet
-> (Bool, FuzzySet)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> State FuzzySet Bool
forall (m :: * -> *). MonadState FuzzySet m => Text -> m Bool
add_
add
:: Text
-> FuzzySet
-> FuzzySet
add :: Text -> FuzzySet -> FuzzySet
add = (Bool, FuzzySet) -> FuzzySet
forall a b. (a, b) -> b
snd ((Bool, FuzzySet) -> FuzzySet)
-> (Text -> FuzzySet -> (Bool, FuzzySet))
-> Text
-> FuzzySet
-> FuzzySet
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> Text -> FuzzySet -> (Bool, FuzzySet)
addToSet
(>+<)
:: FuzzySet
-> Text
-> FuzzySet
>+< :: FuzzySet -> Text -> FuzzySet
(>+<) = (Text -> FuzzySet -> FuzzySet) -> FuzzySet -> Text -> FuzzySet
forall a b c. (a -> b -> c) -> b -> a -> c
flip Text -> FuzzySet -> FuzzySet
add
infixl 4 >+<
addManyToSet
:: [Text]
-> FuzzySet
-> ([Text], FuzzySet)
addManyToSet :: [Text] -> FuzzySet -> ([Text], FuzzySet)
addManyToSet = State FuzzySet [Text] -> FuzzySet -> ([Text], FuzzySet)
forall s a. State s a -> s -> (a, s)
runState (State FuzzySet [Text] -> FuzzySet -> ([Text], FuzzySet))
-> ([Text] -> State FuzzySet [Text])
-> [Text]
-> FuzzySet
-> ([Text], FuzzySet)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> State FuzzySet [Text]
forall (m :: * -> *). MonadState FuzzySet m => [Text] -> m [Text]
addMany_
addMany
:: [Text]
-> FuzzySet
-> FuzzySet
addMany :: [Text] -> FuzzySet -> FuzzySet
addMany = ([Text], FuzzySet) -> FuzzySet
forall a b. (a, b) -> b
snd (([Text], FuzzySet) -> FuzzySet)
-> ([Text] -> FuzzySet -> ([Text], FuzzySet))
-> [Text]
-> FuzzySet
-> FuzzySet
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> [Text] -> FuzzySet -> ([Text], FuzzySet)
addManyToSet
fromList
:: [Text]
-> FuzzySet
fromList :: [Text] -> FuzzySet
fromList = ([Text] -> FuzzySet -> FuzzySet
`addMany` FuzzySet
defaultSet)
values :: FuzzySet -> [Text]
values :: FuzzySet -> [Text]
values = HashMap Text Text -> [Text]
forall k v. HashMap k v -> [v]
elems (HashMap Text Text -> [Text])
-> (FuzzySet -> HashMap Text Text) -> FuzzySet -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FuzzySet -> HashMap Text Text
exactSet
size :: FuzzySet -> Int
size :: FuzzySet -> Int
size = [Text] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([Text] -> Int) -> (FuzzySet -> [Text]) -> FuzzySet -> Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FuzzySet -> [Text]
values
isEmpty :: FuzzySet -> Bool
isEmpty :: FuzzySet -> Bool
isEmpty = [Text] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Text] -> Bool) -> (FuzzySet -> [Text]) -> FuzzySet -> Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> FuzzySet -> [Text]
values