packages feed

cookbook-2.0.0.1: Cookbook/Project/Quill/Quill.hs

module Cookbook.Project.Quill.Quill(tblNames,tables,getTable,lookUp,createTable,removeTable,removeItem,addItem,tableToString,changeItem) where
import qualified Cookbook.Essential.Common         as Cm
import qualified Cookbook.Essential.Continuous     as Ct
import qualified Cookbook.Ingredients.Lists.Remove as Rm
import qualified Cookbook.Ingredients.Lists.Modify as Md
import qualified Cookbook.Ingredients.Lists.Access as Ac
import qualified Cookbook.Ingredients.Lists.Splice as Sp
import qualified Cookbook.Ingredients.Tupples.Look as Lk
import qualified Cookbook.Recipes.Sanitize         as Sn

--Custom data
data Table = Table {name :: String, info :: [(String,String)]}

-- Parsing
prepare :: [String] -> String
prepare = ((flip Sp.splice) ("(*","*)")) . ((flip Sn.blacklist) [' ','\n']) . Cm.flt

tokenize :: [a] -> [(a,a)]
tokenize []  = []
tokenize [x] = []
tokenize (x:y:xs) = (x,y) : tokenize xs

-- Table access
tblNames :: String -> [String]
tblNames x = (Ct.before x '{') : Md.surroundedBy x ('}','{')


headlessData :: String -> [[String]]
headlessData x = map ((flip Md.splitOn) ';') $  (Md.surroundedBy x ('{','}'))

tokenLists :: [[String]] -> [[(String,String)]]
tokenLists x =  map tokenize $ map Cm.flt ( map (map ((flip Md.splitOn) ':')) x)


-- API functions
tables :: [String] -> [(String,[(String,String)])]
tables x = let y = prepare x in
   zip (tblNames y) $ tokenLists (headlessData y)

getTable :: [(String,[(String,String)])] -> String -> [(String,String)]
getTable x c = Cm.flt $ Lk.lookList x c

lookUp :: [(String,[(String,String)])] -> (String,String) -> [String]
lookUp x (c,d) = ((flip Lk.lookList) d) $ getTable x c

createTable :: [(String,[(String,String)])] -> String -> [(String,[(String,String)])]
createTable x c = (c,[]) : x

removeTable :: [(String,[(String,String)])] -> String -> [(String,[(String,String)])]
removeTable x c = [e | e@(d,_) <- x, d /= c]

removeItem :: [(String,[(String,String)])] -> (String,String) -> [(String,[(String,String)])]
removeItem [] _ = []
removeItem ((tbl,ite):re) (tb,it)
  | tbl == tb = (tbl,filter (\(c,d) -> c /= it) ite) : removeItem re (tb,it)
  | otherwise = (tbl,ite) : removeItem re (tb,it)
                
addItem :: [(String,[(String,String)])] -> String -> (String,String) -> [(String,[(String,String)])]
addItem [] _ _ = []
addItem ((a,b):c) tb it = if a == tb then (a,it:b) : addItem c tb it else (a,b) : addItem c tb it

changeItem :: [(String,[(String,String)])] -> (String,String) -> String -> [(String,[(String,String)])]
changeItem db (tb,it) c = addItem (removeItem db (tb,it)) tb (it,c)

tableToString :: (String,[(String,String)]) -> String
tableToString (x,b) = x ++ "{" ++ (Cm.flt (map detokenize b)) ++ "}"
  where detokenize (a,b) = a ++ ":" ++ b ++ ";"