module Lattice ( LatticeCell (..) , Lattice , LatticeRule , updateLattice ) where data LatticeCell a b = LatticeCell { kind :: a, flags :: b } deriving (Show, Eq) type Lattice a b = [[LatticeCell a b]] type LatticeRule a b = Lattice a b -> Int -> Int -> LatticeCell a b updateLattice :: (Enum a) => Lattice a b -> [LatticeRule a b] -> Lattice a b updateLattice lattice rules = let mapRow = \(row, y) -> map (\((LatticeCell k _), x) -> let rule = rules !! (fromEnum k) in rule lattice x y ) (zip row [0..]) in map mapRow (zip lattice [0..])