module Numeric.Limp.Canon.Analyse.Constants where
import Numeric.Limp.Canon.Program
import Numeric.Limp.Rep
import qualified Data.Map as M
constantsProgram :: (Ord z, Ord r, Rep c) => Program z r c -> Assignment z r c
constantsProgram p
= mkAss $ concatMap eq $ M.toList $ _bounds p
where
eq (var, (Just lo, Just up))
| lo == up
= [(var, lo)]
eq _
= []
mkAss ms
= Assignment
(M.fromList $ concatMap tkLeft ms)
(M.fromList $ concatMap tkRight ms)
tkLeft (Left z, v)
| v == (fromZ $ truncate v)
= [(z, truncate v)]
tkLeft _
= []
tkRight (Right r, v)
= [(r, v)]
tkRight _
= []