packages feed

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