module Data.HMemDb.TableVarId (TableVarId(TableVarId), idToVar, varToId) where
import Control.Compose (Id(Id), unId)
import Data.Function (on)
import Data.HMemDb.MapTVar (MS, readTVarMap)
import Data.HMemDb.References (Ref(Ref, refContent, refIndex))
import Data.HMemDb.Tables (Table(Table), tabContent)
import Data.HMemDb.TableVars (TableVar, TableVarS(TableVar))
newtype TableVarId a = TableVarId {unTVId :: Integer}
-- ^ This type can be used for columns in a table.
-- It's sort of a 'ForeignKey' accompanied with a specific index.
instance Eq (TableVarId a) where (==) = (==) `on` unTVId
-- ^ 'TableVarId's pointing to different 'Table's may accidentally appear equal.
instance Ord (TableVarId a) where compare = compare `on` unTVId
varToId :: TableVar a -> TableVarId a
-- ^ This function gets an Id of the variable.
varToId (TableVar iref _) = TableVarId $ refIndex $ unId iref
idToVar :: Table a -> TableVarId a -> MS (TableVar a)
-- ^ This function looks up the specific Id in the 'Table'.
idToVar (Table pt) tvId =
    do let i = unTVId tvId
       tv <- readTVarMap (tabContent pt) i
       return $ TableVar (Id Ref {refContent = tv, refIndex = i}) pt