-- |
-- Module    : GraphHammer.Info
-- Copyright : (C) 2013 Parallel Scientific Labs, LLC.
-- License   : GPLv2
--
-- Defines a classes to store and read info for GraphHammer edges and vertices
-- information.
--
-- Also defines instances of those classes for unit (). It is meant as a safe
-- way to say "no useful information". Its use as an info should not incur any
-- cost.

{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeSynonymInstances #-}

module GraphHammer.Info(
	  Info(..)
	, InfoArray(..)
	) where

import Data.Array

import G500.Index

-------------------------------------------------------------------------------
-- Classes for information storage.

-- |A class to store information.
class Info a where
	-- |A type we encode our values to.
	type EncodingType a

	-- |A method to encode value.
	encodeInfo :: a -> EncodingType a

	-- |Decoding process.
	decodeInfo :: EncodingType a -> a

-- |A class that defines "array interface" for GraphHammer information.
class (Num i, Ix i, Info a) => InfoArray i a where
	-- |A type for arrays with specified index.
	type EncodedInfoArray i a

	-- |Create an array.
	-- First parameter is a length of array.
	newEncodedInfoArray :: Monad m => a -> i -> m (EncodedInfoArray i a)

	-- |Get a value from array.
	readEncodedInfo :: Monad m => EncodedInfoArray i a -> i -> m a

	-- |Store an encoded value.
	storeEncodedInfo :: Monad m => EncodedInfoArray i a -> i -> a -> m ()

-------------------------------------------------------------------------------
-- Instances for () type.

instance Info () where
	type EncodingType () = ()
	encodeInfo = const ()
	decodeInfo = const ()

instance InfoArray Index () where
	type EncodedInfoArray Index () = ()
	newEncodedInfoArray _ _ = return ()
	readEncodedInfo _ _ = return ()
	storeEncodedInfo _ _ _ = return ()

instance InfoArray Int () where
	type EncodedInfoArray Int () = ()
	newEncodedInfoArray _ _ = return ()
	readEncodedInfo _ _ = return ()
	storeEncodedInfo _ _ _ = return ()