{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  ToySolver.Data.IntVar
-- Copyright   :  (c) Masahiro Sakai 2011-2013
-- License     :  BSD-style
-- 
-- Maintainer  :  masahiro.sakai@gmail.com
-- Stability   :  provisional
-- Portability :  non-portable (MultiParamTypeClasses)
-- 
-----------------------------------------------------------------------------
module ToySolver.Data.IntVar
  ( Var
  , VarSet
  , VarMap
  , Variables (..)
  , Model
  , Eval (..)
  ) where

import Data.IntMap (IntMap)
import Data.IntSet (IntSet)
import qualified Data.IntSet as IntSet
import Data.Ratio

-- ---------------------------------------------------------------------------

-- | Variables are represented as non-negative integers
type Var = Int

-- | Set of variables
type VarSet = IntSet

-- | Map from variables
type VarMap = IntMap

-- | collecting free variables
class Variables a where
  vars :: a -> VarSet

instance Variables a => Variables [a] where
  vars = IntSet.unions . map vars

-- | A @Model@ is a map from variables to values.
type Model r = VarMap r

-- | Evaluataion of something (e.g. expression or formula) under the model.
class Eval m e v | m e -> v where
  eval :: m -> e -> v

-- ---------------------------------------------------------------------------