From 0a2d18ec27a6ef1dea90e57632834a7eb84bb9cf Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Tue, 23 Aug 2022 12:32:38 +0200
Subject: Added advanced suggestion AI

blockchain soon
---
 src/Helper.hs | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

(limited to 'src/Helper.hs')

diff --git a/src/Helper.hs b/src/Helper.hs
index 5433dd0..0c2b576 100644
--- a/src/Helper.hs
+++ b/src/Helper.hs
@@ -6,6 +6,7 @@
 module Helper where
 
 import qualified Control.Monad.State           as S
+import           Data.Array
 import qualified Data.BitString                as Bit
 import qualified Data.ByteString               as Byte
 import qualified Data.ByteString.Char8         as C
@@ -35,9 +36,10 @@ printContext (Context inp path) = p $ lines inp
 
 errPrefix :: String
 errPrefix = "\ESC[41mERROR\ESC[0m "
-data Error = SyntaxError String | UndefinedIdentifier Identifier | InvalidIndex Int | FailedTest Expression Expression Expression Expression | ContextualError Error Context | ImportError String
+data Error = SyntaxError String | UndefinedIdentifier Identifier | InvalidIndex Int | FailedTest Expression Expression Expression Expression | ContextualError Error Context | SuggestSolution Error String | ImportError String
 instance Show Error where
   show (ContextualError err ctx) = show err <> "\n" <> (printContext ctx)
+  show (SuggestSolution err sol) = show err <> "\nPerhaps you meant: " <> sol
   show (SyntaxError err) =
     errPrefix <> "invalid syntax\n\ESC[45mnear\ESC[0m " <> err
   show (UndefinedIdentifier ident) =
@@ -211,6 +213,25 @@ decodeStdout e = do
 
 ---
 
+-- from reddit u/cgibbard
+levenshtein :: (Eq a) => [a] -> [a] -> Int
+levenshtein xs ys = levMemo ! (n, m)
+ where
+  levMemo =
+    array ((0, 0), (n, m)) [ ((i, j), lev i j) | i <- [0 .. n], j <- [0 .. m] ]
+  n  = length xs
+  m  = length ys
+  xa = listArray (1, n) xs
+  ya = listArray (1, m) ys
+  lev 0 v = v
+  lev u 0 = u
+  lev u v
+    | xa ! u == ya ! v = levMemo ! (u - 1, v - 1)
+    | otherwise = 1 + minimum
+      [levMemo ! (u, v - 1), levMemo ! (u - 1, v), levMemo ! (u - 1, v - 1)]
+
+---
+
 -- TODO: Performanize
 matchingFunctions :: Expression -> Environment -> String
 matchingFunctions e (Environment env) =
-- 
cgit v1.2.3