module FST.Utils (
cross,
insert,
merge,
remove,
tagging
) where
cross :: [a] -> [b] -> [(a,b)]
cross as bs = [(a,b) | a <- as, b <- bs]
insert :: Eq b => (b,[(a,b)]) -> [(b,[(a,b)])] -> [(b,[(a,b)])]
insert (s, t1) [] = [(s,t1)]
insert (s, t1) ((s1,t2):xs)
| s == s1 = (s1, t1++t2):xs
| otherwise = (s1,t2):insert (s,t1) xs
merge :: Eq b => [(b,[(a,b)])] -> [(b,[(a,b)])] -> [(b,[(a,b)])]
merge [] table2 = table2
merge (a:table1) table2 = merge table1 (insert a table2)
remove :: Eq b => b -> [(b,[(a,b)])] -> [(b,[(a,b)])]
remove _ [] = []
remove s ((s1,tl):xs)
| s == s1 = xs
| otherwise = (s1,tl):remove s xs
tagging :: [a] -> Int -> (Int,[(a,Int)])
tagging xs s = tag xs s [] where
tag [] s1 ys = ((s11),ys)
tag (a:zs) s1 ys = tag zs (s1+1) ((a,s1):ys)