module BishBosh.Data.List(
findClosest,
unabbreviate
) where
import Control.Arrow((&&&))
import qualified Data.List
import qualified Data.List.Extra
import qualified ToolShed.Data.List
findClosest
:: Eq a
=> [a]
-> [[a]]
-> [[a]]
findClosest :: [a] -> [[a]] -> [[a]]
findClosest [a]
_ [] = []
findClosest [a]
s [[a]]
choices = case [(Rational, [a])] -> [(Rational, [[a]])]
forall k v. Ord k => [(k, v)] -> [(k, [v])]
Data.List.Extra.groupSort ([(Rational, [a])] -> [(Rational, [[a]])])
-> [(Rational, [a])] -> [(Rational, [[a]])]
forall a b. (a -> b) -> a -> b
$ ([a] -> (Rational, [a])) -> [[a]] -> [(Rational, [a])]
forall a b. (a -> b) -> [a] -> [b]
map (
(\Rational
d -> Rational
d :: Rational) (Rational -> Rational) -> ([a] -> Rational) -> [a] -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Rational
forall a. Num a => a -> a
negate (Rational -> Rational) -> ([a] -> Rational) -> [a] -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a], [a]) -> Rational
forall a distance.
(Eq a, Fractional distance) =>
([a], [a]) -> distance
ToolShed.Data.List.measureJaroDistance (([a], [a]) -> Rational) -> ([a] -> ([a], [a])) -> [a] -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,) [a]
s ([a] -> Rational) -> ([a] -> [a]) -> [a] -> (Rational, [a])
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& [a] -> [a]
forall a. a -> a
id
) [[a]]
choices of
(Rational
_, [[a]]
x) : [(Rational, [[a]])]
_ -> [[a]]
x
[(Rational, [[a]])]
_ -> []
unabbreviate
:: Eq a
=> ([a] -> [a])
-> [[a]]
-> [a]
-> [a]
unabbreviate :: ([a] -> [a]) -> [[a]] -> [a] -> [a]
unabbreviate [a] -> [a]
f [[a]]
choices [a]
l = case ([a] -> Bool) -> [[a]] -> [[a]]
forall a. (a -> Bool) -> [a] -> [a]
filter (
[a] -> [a] -> Bool
forall a. Eq a => [a] -> [a] -> Bool
Data.List.isPrefixOf ([a] -> [a]
f [a]
l) ([a] -> Bool) -> ([a] -> [a]) -> [a] -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
f
) [[a]]
choices of
[[a]
x] -> [a]
x
[[a]]
_ -> [a]
l