{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
-----------------------------------------------------------------------------
--
-- Module      :  Math.IMM
-- Copyright   :  Christian Gosch
-- License     :  BSD3
--
-- Maintainer  :
-- Stability   :
-- Portability :
--
-- |
--
-----------------------------------------------------------------------------

module Numeric.Jalla.IMM (
    IMM (..)
) where

import Data.Ix

{-| Indexable objects modification monad class.
    Monads in this type class are used to modify and create indexable objects
    such as matrices or vectors. This is to provide a common interface
    for such 'modification monads'. -}
class (Ix i) => IMM m i o e | m -> o, m -> i, m -> e where
    -- These three lead to functional dependency collisions since
    -- the type of the result can not be decided by the compiler.
    --create   :: i -> m a -> o
    --modify   :: o -> m a -> o
    --getO     :: m o
    setElem  :: i -> e -> m ()
    setElems :: [(i,e)] -> m ()
    fill     :: e -> m ()
    getElem  :: i -> m e
