lhae-0.0.2: src/Model/GridHeader.hs
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