@@ -14,15 +14,18 @@ module Deps.Get
1414import Prelude hiding (all)
1515import Control.Monad.Except (catchError, liftIO)
1616import qualified Data.ByteString as BS
17+import Data.Function (on)
1718import qualified Data.List as List
1819import qualified Data.Map as Map
1920import Data.Map (Map)
21+import qualified Data.Text as Text
2022import qualified System.Directory as Dir
2123import System.FilePath ((</>))
2224import qualified Text.PrettyPrint.ANSI.Leijen as P
2325
2426import qualified Elm.Docs as Docs
2527import qualified Elm.Package as Pkg
28+import qualified Elm.Utils as Utils
2629
2730import qualified Deps.Website as Website
2831import qualified Elm.Project.Json as Project
@@ -100,7 +103,34 @@ versions name (AllPackages pkgs) =
100103 Right vsns
101104
102105 Nothing ->
103− Left (Map.keys pkgs)
106+ Left (nearbyNames name (Map.keys pkgs))
107+
108+
109+nearbyNames :: Pkg.Name -> [Pkg.Name] -> [Pkg.Name]
110+nearbyNames (Pkg.Name author1 project1) possibleNames =
111+ let
112+ authorDist = authorDistance (Text.unpack author1)
113+ projectDist = projectDistance (Text.unpack project1)
114+
115+ addDistance name@(Pkg.Name author2 project2) =
116+ ( authorDist author2 + projectDist project2, name )
117+ in
118+ map snd $ take 4 $
119+ List.sortBy (compare `on` fst) $
120+ map addDistance possibleNames
121+
122+
123+authorDistance :: String -> Text.Text -> Int
124+authorDistance bad possibility =
125+ abs (Utils.distance bad (Text.unpack possibility))
126+
127+
128+projectDistance :: String -> Text.Text -> Int
129+projectDistance bad possibility =
130+ if possibility == "elm-lang" || possibility == "elm-explorations" then
131+ 0
132+ else
133+ abs (Utils.distance bad (Text.unpack possibility))
104134
105135
106136