1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47module Parsers.SqlParser where
import Data.List (isSuffixOf)
parser :: String -> String -> IO [[String]]
parser file null_val = do
contents <- readFile file
let lines = words contents
-- acumulator example
let (_, _, query_list) =
-- ik this ain't pure cause is mutating, but I couldn't find another solution
foldl
( \(actualQuery, actualQueryFamily, queriesFamily) line ->
queryConcatenator
line
null_val
actualQuery
actualQueryFamily
queriesFamily
)
("", [], [])
lines
return query_list
queryConcatenator :: String -> String -> String -> [String] -> [[String]] -> (String, [String], [[String]])
queryConcatenator -- ngl, like the way the hsl refactors code
line
null_val
currentQuery
currentQueryFamily
completedQueriesFamily
| null_val `isSuffixOf` line -- pattern for the null_val (separator)
=
( "",
[],
completedQueriesFamily ++ [currentQueryFamily] -- appends to the family
)
| ";" `isSuffixOf` line -- for setting end of a query
=
let fullQuery = currentQuery ++ line
in ("", currentQueryFamily ++ [fullQuery], completedQueriesFamily)
| otherwise -- self-explanatory asf
=
let newCurrent = currentQuery ++ line ++ " "
in (newCurrent, currentQueryFamily, completedQueriesFamily)