module Model.GridHeader (Header,new,addDependent,deleteDependent ,dependents,allDependents,index,setLabel ,delete,label) where import Control.Applicative ((<$>)) import Control.Monad (forM) import qualified Data.List as List import Data.Ix (range) import Util.DynArray (DynArray) import qualified Util.DynArray as DynArray import CellCoordinate (CellCoord) type Label = String type Info = (Label,[CellCoord]) type Header = DynArray Int Info new :: IO Header new = DynArray.newLinearArray 0 ("",[]) setLabel :: Label -> Int -> Header -> IO () setLabel label to = DynArray.update to (\(_,deps) -> (label,deps)) addDependent :: CellCoord -> Int -> Header -> IO () addDependent dep to = DynArray.update to (\(l,deps) -> (l,dep:deps)) deleteDependent :: CellCoord -> Int -> Header -> IO () deleteDependent dep from = DynArray.update from (\(l,deps) -> (l,List.delete dep deps)) label :: Int -> Header -> IO Label label i header = fst <$> DynArray.read i header dependents :: Int -> Header -> IO [CellCoord] dependents i header = snd <$> DynArray.read i header allDependents :: Header -> IO [CellCoord] allDependents header = do b <- DynArray.bounds header concat <$> (forM (range b) $ \i -> dependents i header) index :: String -> Header -> IO (Maybe Int) index label = DynArray.indexBy (\(l,_) -> label == l) delete :: [Int] -> Header -> IO () delete = DynArray.deleteInLinearArray