module Feldspar.Core.Constructs.MutableArray
(MutableArray(..))
where
import Control.Monad
import Data.Array.IO
import Language.Syntactic
import Language.Syntactic.Constructs.Binding
import Feldspar.Lattice
import Feldspar.Core.Types
import Feldspar.Core.Interpretation
data MutableArray a
where
NewArr :: Type a => MutableArray (Length :-> a :-> Full (Mut (MArr a)))
NewArr_ :: Type a => MutableArray (Length :-> Full (Mut (MArr a)))
GetArr :: Type a => MutableArray (MArr a :-> Index :-> Full (Mut a))
SetArr :: MutableArray (MArr a :-> Index :-> a :-> Full (Mut ()))
ArrLength :: MutableArray (MArr a :-> Full (Mut Length))
instance Semantic MutableArray
where
semantics NewArr = Sem "newMArr" $ \l -> newArray (mkBounds l)
semantics NewArr_ = Sem "newMArr_" $ \l -> newListArray (mkBounds l)
[error $ "Undefined element at index " ++ show (i::Index) | i <- [0..]]
semantics GetArr = Sem "getMArr" readArray
semantics SetArr = Sem "setMArr" writeArray
semantics ArrLength = Sem "arrLength" (getBounds >=> \(l,u) -> return (ul+1))
mkBounds :: Length -> (Length,Length)
mkBounds 0 = (pred 0, 0)
mkBounds l = (0, pred l)
semanticInstances ''MutableArray
instance EvalBind MutableArray where evalBindSym = evalBindSymDefault
instance AlphaEq dom dom dom env => AlphaEq MutableArray MutableArray dom env
where
alphaEqSym = alphaEqSymDefault
instance Sharable MutableArray
instance Monotonic MutableArray
instance SizeProp MutableArray
where
sizeProp NewArr (WrapFull len :* _ :* Nil) = infoSize len :> universal
sizeProp NewArr_ (WrapFull len :* Nil) = infoSize len :> universal
sizeProp GetArr _ = universal
sizeProp SetArr _ = universal
sizeProp ArrLength (WrapFull arr :* Nil) = len
where
len :> _ = infoSize arr
instance (MutableArray :<: dom, Optimize dom dom) => Optimize MutableArray dom
where
constructFeatUnOpt opts NewArr args = constructFeatUnOptDefaultTyp opts (MutType $ MArrType typeRep) NewArr args
constructFeatUnOpt opts NewArr_ args = constructFeatUnOptDefaultTyp opts (MutType $ MArrType typeRep) NewArr_ args
constructFeatUnOpt opts GetArr args = constructFeatUnOptDefaultTyp opts (MutType typeRep) GetArr args
constructFeatUnOpt opts SetArr args = constructFeatUnOptDefaultTyp opts (MutType typeRep) SetArr args
constructFeatUnOpt opts ArrLength args = constructFeatUnOptDefaultTyp opts (MutType typeRep) ArrLength args