imperative-edsl 0.8.1 → 0.8.2
raw patch · 6 files changed
+104/−55 lines, 6 filesdep +constraintsdep ~containersPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: constraints
Dependency ranges changed: containers
API changes (from Hackage documentation)
- Language.Embedded.Imperative.CMD: instance forall k k2 (instr :: (* -> *, (k -> *, (k2, *))) -> * -> *) env. (Language.Embedded.Imperative.CMD.PtrCMD Data.ALaCarte.:<: instr) => Control.Monad.Operational.Higher.Reexpressible Language.Embedded.Imperative.CMD.PtrCMD instr env
- Language.Embedded.Imperative.CMD: instance forall k2 (pred :: k2). Control.Monad.Operational.Higher.InterpBi Language.Embedded.Imperative.CMD.PtrCMD GHC.Types.IO (Data.ALaCarte.Param1 pred)
- Language.Embedded.Imperative.Frontend: instance (Language.Embedded.Imperative.CMD.Formattable a, Language.Embedded.Imperative.Frontend.PrintfType r, exp GHC.Types.~ Language.Embedded.Imperative.Frontend.PrintfExp r) => Language.Embedded.Imperative.Frontend.PrintfType (exp a -> r)
+ Language.Embedded.Imperative.CMD: [Comment] :: String -> ControlCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [Hint] :: pred a => exp a -> ControlCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [SwapArr] :: (Typeable i, Typeable a, pred i, pred a) => Arr i a -> Arr i a -> PtrCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: instance Control.Monad.Operational.Higher.InterpBi Language.Embedded.Imperative.CMD.PtrCMD GHC.Types.IO (Data.ALaCarte.Param1 pred)
+ Language.Embedded.Imperative.CMD: instance forall k (instr :: (* -> *, (k -> *, (* -> GHC.Types.Constraint, *))) -> * -> *) env. (Language.Embedded.Imperative.CMD.PtrCMD Data.ALaCarte.:<: instr) => Control.Monad.Operational.Higher.Reexpressible Language.Embedded.Imperative.CMD.PtrCMD instr env
+ Language.Embedded.Imperative.Frontend: hint :: (ControlCMD :<: instr, pred a) => exp a -> ProgramT instr (Param2 exp pred) m ()
+ Language.Embedded.Imperative.Frontend: instance (Language.Embedded.Imperative.CMD.Formattable a, Language.Embedded.Imperative.Frontend.PrintfType r, exp GHC.Types.~ Language.Embedded.Imperative.Frontend.PrintfExp r, Language.Embedded.Imperative.Frontend.PrintfPred r a) => Language.Embedded.Imperative.Frontend.PrintfType (exp a -> r)
+ Language.Embedded.Imperative.Frontend: unsafeSwapArr :: (Typeable i, Typeable a, pred i, pred a, PtrCMD :<: instr) => Arr i a -> Arr i a -> ProgramT instr (Param2 exp pred) m ()
- Language.Embedded.Concurrent: readChanBuf :: (Typeable a, pred a, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t a -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
+ Language.Embedded.Concurrent: readChanBuf :: (Typeable a, pred a, pred i, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t a -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
- Language.Embedded.Concurrent: readChanBuf' :: (Typeable a, pred a, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t c -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
+ Language.Embedded.Concurrent: readChanBuf' :: (Typeable a, pred a, pred i, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t c -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
- Language.Embedded.Concurrent: writeChanBuf :: (Typeable a, pred a, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t a -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
+ Language.Embedded.Concurrent: writeChanBuf :: (Typeable a, pred a, pred i, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t a -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
- Language.Embedded.Concurrent: writeChanBuf' :: (Typeable a, pred a, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t c -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
+ Language.Embedded.Concurrent: writeChanBuf' :: (Typeable a, pred a, pred i, Ix i, Integral i, FreeExp exp, FreePred exp Bool, ChanCMD :<: instr, Monad m) => Chan t c -> exp i -> exp i -> Arr i a -> ProgramT instr (Param2 exp pred) m (exp Bool)
- Language.Embedded.Concurrent.CMD: [ReadChan] :: (Typeable a, pred a, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool)
+ Language.Embedded.Concurrent.CMD: [ReadChan] :: (Typeable a, pred a, pred i, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool)
- Language.Embedded.Concurrent.CMD: [WriteChan] :: (Typeable a, pred a, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool)
+ Language.Embedded.Concurrent.CMD: [WriteChan] :: (Typeable a, pred a, pred i, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool)
- Language.Embedded.Imperative.CMD: [ConstArr] :: (pred a, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: [ConstArr] :: (pred a, pred i, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: [ConstCArr] :: (pred a, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: [ConstCArr] :: (pred a, pred i, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: [CopyArr] :: (pred a, Integral i, Ix i) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ArrCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [CopyArr] :: (pred a, pred i, Integral i, Ix i) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ArrCMD (Param3 prog exp pred) ()
- Language.Embedded.Imperative.CMD: [FPrintf] :: Handle -> String -> [PrintfArg exp] -> FileCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [FPrintf] :: Handle -> String -> [PrintfArg exp pred] -> FileCMD (Param3 prog exp pred) ()
- Language.Embedded.Imperative.CMD: [GetArr] :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> ArrCMD (Param3 prog exp pred) (Val a)
+ Language.Embedded.Imperative.CMD: [GetArr] :: (pred a, pred i, Integral i, Ix i) => Arr i a -> exp i -> ArrCMD (Param3 prog exp pred) (Val a)
- Language.Embedded.Imperative.CMD: [NewArr] :: (pred a, Integral i, Ix i) => String -> exp i -> ArrCMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: [NewArr] :: (pred a, pred i, Integral i, Ix i) => String -> exp i -> ArrCMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: [NewCArr] :: (pred a, Integral i, Ix i) => String -> Maybe i -> exp i -> C_CMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: [NewCArr] :: (pred a, pred i, Integral i, Ix i) => String -> Maybe i -> exp i -> C_CMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: [PrintfArg] :: PrintfArg a => exp a -> PrintfArg exp
+ Language.Embedded.Imperative.CMD: [PrintfArg] :: (PrintfArg a, pred a) => exp a -> PrintfArg exp pred
- Language.Embedded.Imperative.CMD: [SetArr] :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> exp a -> ArrCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [SetArr] :: (pred a, pred i, Integral i, Ix i) => Arr i a -> exp i -> exp a -> ArrCMD (Param3 prog exp pred) ()
- Language.Embedded.Imperative.CMD: [SwapPtr] :: IsPointer a => a -> a -> PtrCMD (Param3 prog exp pred) ()
+ Language.Embedded.Imperative.CMD: [SwapPtr] :: Ptr a -> Ptr a -> PtrCMD (Param3 prog exp pred) ()
- Language.Embedded.Imperative.CMD: [UnsafeFreezeArr] :: (pred a, Integral i, Ix i) => Arr i a -> ArrCMD (Param3 prog exp pred) (IArr i a)
+ Language.Embedded.Imperative.CMD: [UnsafeFreezeArr] :: (pred a, pred i, Integral i, Ix i) => Arr i a -> ArrCMD (Param3 prog exp pred) (IArr i a)
- Language.Embedded.Imperative.CMD: [UnsafeThawArr] :: (pred a, Integral i, Ix i) => IArr i a -> ArrCMD (Param3 prog exp pred) (Arr i a)
+ Language.Embedded.Imperative.CMD: [UnsafeThawArr] :: (pred a, pred i, Integral i, Ix i) => IArr i a -> ArrCMD (Param3 prog exp pred) (Arr i a)
- Language.Embedded.Imperative.CMD: data PrintfArg exp
+ Language.Embedded.Imperative.CMD: data PrintfArg exp pred
- Language.Embedded.Imperative.CMD: mapPrintfArg :: (forall a. exp1 a -> exp2 a) -> PrintfArg exp1 -> PrintfArg exp2
+ Language.Embedded.Imperative.CMD: mapPrintfArg :: (forall a. pred a => exp1 a -> exp2 a) -> PrintfArg exp1 pred -> PrintfArg exp2 pred
- Language.Embedded.Imperative.CMD: mapPrintfArgM :: Monad m => (forall a. exp1 a -> m (exp2 a)) -> PrintfArg exp1 -> m (PrintfArg exp2)
+ Language.Embedded.Imperative.CMD: mapPrintfArgM :: Monad m => (forall a. pred a => exp1 a -> m (exp2 a)) -> PrintfArg exp1 pred -> m (PrintfArg exp2 pred)
- Language.Embedded.Imperative.Frontend: constArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: constArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend: constNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => String -> [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: constNamedArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => String -> [a] -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend: copyArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ProgramT instr (Param2 exp pred) m ()
+ Language.Embedded.Imperative.Frontend: copyArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ProgramT instr (Param2 exp pred) m ()
- Language.Embedded.Imperative.Frontend: fprf :: PrintfType r => Handle -> String -> [PrintfArg (PrintfExp r)] -> r
+ Language.Embedded.Imperative.Frontend: fprf :: PrintfType r => Handle -> String -> [PrintfArg (PrintfExp r) (PrintfPred r)] -> r
- Language.Embedded.Imperative.Frontend: fput :: forall instr exp pred a m. (Formattable a, FreePred exp a, FileCMD :<: instr) => Handle -> String -> exp a -> String -> ProgramT instr (Param2 exp pred) m ()
+ Language.Embedded.Imperative.Frontend: fput :: forall instr exp pred a m. (Formattable a, FreePred exp a, FileCMD :<: instr, pred a) => Handle -> String -> exp a -> String -> ProgramT instr (Param2 exp pred) m ()
- Language.Embedded.Imperative.Frontend: freezeArr :: (pred a, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m) => Arr i a -> exp i -> ProgramT instr (Param2 exp pred) m (IArr i a)
+ Language.Embedded.Imperative.Frontend: freezeArr :: (pred a, pred i, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m) => Arr i a -> exp i -> ProgramT instr (Param2 exp pred) m (IArr i a)
- Language.Embedded.Imperative.Frontend: getArr :: (pred a, FreeExp exp, FreePred exp a, Integral i, Ix i, ArrCMD :<: instr, Monad m) => Arr i a -> exp i -> ProgramT instr (Param2 exp pred) m (exp a)
+ Language.Embedded.Imperative.Frontend: getArr :: (pred a, pred i, FreeExp exp, FreePred exp a, Integral i, Ix i, ArrCMD :<: instr, Monad m) => Arr i a -> exp i -> ProgramT instr (Param2 exp pred) m (exp a)
- Language.Embedded.Imperative.Frontend: newArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => exp i -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: newArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => exp i -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend: newNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => String -> exp i -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: newNamedArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => String -> exp i -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend: setArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> exp i -> exp a -> ProgramT instr (Param2 exp pred) m ()
+ Language.Embedded.Imperative.Frontend: setArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> exp i -> exp a -> ProgramT instr (Param2 exp pred) m ()
- Language.Embedded.Imperative.Frontend: thawArr :: (pred a, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m) => IArr i a -> exp i -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: thawArr :: (pred a, pred i, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m) => IArr i a -> exp i -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend: type family PrintfExp r :: * -> *;
+ Language.Embedded.Imperative.Frontend: type family PrintfPred r :: * -> Constraint;
- Language.Embedded.Imperative.Frontend: unsafeFreezeArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> ProgramT instr (Param2 exp pred) m (IArr i a)
+ Language.Embedded.Imperative.Frontend: unsafeFreezeArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> ProgramT instr (Param2 exp pred) m (IArr i a)
- Language.Embedded.Imperative.Frontend: unsafeSwap :: (IsPointer a, PtrCMD :<: instr) => a -> a -> ProgramT instr (Param2 exp pred) m ()
+ Language.Embedded.Imperative.Frontend: unsafeSwap :: PtrCMD :<: instr => Ptr a -> Ptr a -> ProgramT instr (Param2 exp pred) m ()
- Language.Embedded.Imperative.Frontend: unsafeThawArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) => IArr i a -> ProgramT instr (Param2 exp pred) m (Arr i a)
+ Language.Embedded.Imperative.Frontend: unsafeThawArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => IArr i a -> ProgramT instr (Param2 exp pred) m (Arr i a)
- Language.Embedded.Imperative.Frontend.General: data PrintfArg exp
+ Language.Embedded.Imperative.Frontend.General: data PrintfArg exp pred
Files
- imperative-edsl.cabal +4/−3
- src/Language/Embedded/Concurrent.hs +4/−4
- src/Language/Embedded/Concurrent/CMD.hs +2/−2
- src/Language/Embedded/Imperative/Backend/C.hs +15/−1
- src/Language/Embedded/Imperative/CMD.hs +51/−29
- src/Language/Embedded/Imperative/Frontend.hs +28/−16
imperative-edsl.cabal view
@@ -1,5 +1,5 @@ name: imperative-edsl-version: 0.8.1+version: 0.8.2 synopsis: Deep embedding of imperative programs with code generation description: Deep embedding of imperative programs with code generation. .@@ -86,7 +86,8 @@ build-depends: array < 0.6, base >=4 && <5,- containers < 0.7,+ constraints >= 0.9,+ containers >= 0.5.10 && < 0.7, data-default-class < 0.2, deepseq < 1.5, directory < 1.4,@@ -106,7 +107,7 @@ -- That version fixes overlap bugs time >= 1.5.0.1 && < 1.12, stm >= 2.4 && < 2.6-+ hs-source-dirs: src test-suite Tests
src/Language/Embedded/Concurrent.hs view
@@ -106,7 +106,7 @@ -- The semantics are the same as for 'readChan', where "channel is empty" -- is defined as "channel contains less data than requested". -- Returns @False@ without reading any data if the channel is closed.-readChanBuf :: ( Typeable a, pred a+readChanBuf :: ( Typeable a, pred a, pred i , Ix i, Integral i , FreeExp exp, FreePred exp Bool , ChanCMD :<: instr, Monad m )@@ -134,7 +134,7 @@ -- The semantics are the same as for 'writeChan', where "channel is full" -- is defined as "channel has insufficient free space to store all written -- data".-writeChanBuf :: ( Typeable a, pred a+writeChanBuf :: ( Typeable a, pred a, pred i , Ix i, Integral i , FreeExp exp, FreePred exp Bool , ChanCMD :<: instr, Monad m )@@ -184,7 +184,7 @@ -> ProgramT instr (Param2 exp pred) m (exp a) readChan' = fmap valToExp . singleInj . ReadOne -readChanBuf' :: ( Typeable a, pred a+readChanBuf' :: ( Typeable a, pred a, pred i , Ix i, Integral i , FreeExp exp, FreePred exp Bool , ChanCMD :<: instr, Monad m )@@ -203,7 +203,7 @@ -> ProgramT instr (Param2 exp pred) m (exp Bool) writeChan' c = fmap valToExp . singleInj . WriteOne c -writeChanBuf' :: ( Typeable a, pred a+writeChanBuf' :: ( Typeable a, pred a, pred i , Ix i, Integral i , FreeExp exp, FreePred exp Bool , ChanCMD :<: instr, Monad m )
src/Language/Embedded/Concurrent/CMD.hs view
@@ -133,10 +133,10 @@ WriteOne :: (Typeable a, pred a) => Chan t c -> exp a -> ChanCMD (Param3 prog exp pred) (Val Bool) - ReadChan :: (Typeable a, pred a, Ix i, Integral i)+ ReadChan :: (Typeable a, pred a, pred i, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool)- WriteChan :: (Typeable a, pred a, Ix i, Integral i)+ WriteChan :: (Typeable a, pred a, pred i, Ix i, Integral i) => Chan t c -> exp i -> exp i -> Arr i a -> ChanCMD (Param3 prog exp pred) (Val Bool)
src/Language/Embedded/Imperative/Backend/C.hs view
@@ -13,6 +13,7 @@ #endif import Control.Monad.State import Data.Proxy+import Data.Loc import Language.C.Quote.GCC import qualified Language.C.Syntax as C@@ -174,7 +175,10 @@ addInclude "<assert.h>" c <- compExp cond addStm [cstm| assert($c && $msg); |]-+compControlCMD (Hint _) = return ()+compControlCMD (Comment msg) = do+ addStm (C.EscStm ("/* " ++ msg ++ " */") noLoc)+ compPtrCMD :: PtrCMD (Param3 prog exp pred) a -> CGen a compPtrCMD (SwapPtr a b) = do let swap_ptr =@@ -186,6 +190,16 @@ -- or `b`. addGlobal [cedecl| $esc:swap_ptr |] addStm [cstm| swap_ptr($id:a, $id:b); |]+compPtrCMD (SwapArr a b) = do+ let swap_arr =+ "#define swap_arr(a,b) do {void* TmP=a; a=b; b=TmP;} while (0)"+ -- See this solution on the use of `do{}while(0)`:+ -- <http://stackoverflow.com/a/3982397/1105347>+ --+ -- The name "TmP" is to make it very unlikely to have the same name as `a`+ -- or `b`.+ addGlobal [cedecl| $esc:swap_arr |]+ addStm [cstm| swap_arr($id:a, $id:b); |] compIOMode :: IOMode -> String compIOMode ReadMode = "r"
src/Language/Embedded/Imperative/CMD.hs view
@@ -182,14 +182,14 @@ -- | Commands for mutable arrays data ArrCMD fs a where- NewArr :: (pred a, Integral i, Ix i) => String -> exp i -> ArrCMD (Param3 prog exp pred) (Arr i a)- ConstArr :: (pred a, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)- GetArr :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> ArrCMD (Param3 prog exp pred) (Val a)- SetArr :: (pred a, Integral i, Ix i) => Arr i a -> exp i -> exp a -> ArrCMD (Param3 prog exp pred) ()- CopyArr :: (pred a, Integral i, Ix i) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ArrCMD (Param3 prog exp pred) ()+ NewArr :: (pred a, pred i, Integral i, Ix i) => String -> exp i -> ArrCMD (Param3 prog exp pred) (Arr i a)+ ConstArr :: (pred a, pred i, Integral i, Ix i) => String -> [a] -> ArrCMD (Param3 prog exp pred) (Arr i a)+ GetArr :: (pred a, pred i, Integral i, Ix i) => Arr i a -> exp i -> ArrCMD (Param3 prog exp pred) (Val a)+ SetArr :: (pred a, pred i, Integral i, Ix i) => Arr i a -> exp i -> exp a -> ArrCMD (Param3 prog exp pred) ()+ CopyArr :: (pred a, pred i, Integral i, Ix i) => (Arr i a, exp i) -> (Arr i a, exp i) -> exp i -> ArrCMD (Param3 prog exp pred) () -- The arrays are paired with their offset- UnsafeFreezeArr :: (pred a, Integral i, Ix i) => Arr i a -> ArrCMD (Param3 prog exp pred) (IArr i a)- UnsafeThawArr :: (pred a, Integral i, Ix i) => IArr i a -> ArrCMD (Param3 prog exp pred) (Arr i a)+ UnsafeFreezeArr :: (pred a, pred i, Integral i, Ix i) => Arr i a -> ArrCMD (Param3 prog exp pred) (IArr i a)+ UnsafeThawArr :: (pred a, pred i, Integral i, Ix i) => IArr i a -> ArrCMD (Param3 prog exp pred) (Arr i a) #if __GLASGOW_HASKELL__>=708 deriving Typeable #endif@@ -277,11 +277,13 @@ data ControlCMD fs a where- If :: exp Bool -> prog () -> prog () -> ControlCMD (Param3 prog exp pred) ()- While :: prog (exp Bool) -> prog () -> ControlCMD (Param3 prog exp pred) ()- For :: (pred i, Integral i) => IxRange (exp i) -> (Val i -> prog ()) -> ControlCMD (Param3 prog exp pred) ()- Break :: ControlCMD (Param3 prog exp pred) ()- Assert :: exp Bool -> String -> ControlCMD (Param3 prog exp pred) ()+ If :: exp Bool -> prog () -> prog () -> ControlCMD (Param3 prog exp pred) ()+ While :: prog (exp Bool) -> prog () -> ControlCMD (Param3 prog exp pred) ()+ For :: (pred i, Integral i) => IxRange (exp i) -> (Val i -> prog ()) -> ControlCMD (Param3 prog exp pred) ()+ Break :: ControlCMD (Param3 prog exp pred) ()+ Assert :: exp Bool -> String -> ControlCMD (Param3 prog exp pred) ()+ Hint :: pred a => exp a -> ControlCMD (Param3 prog exp pred) ()+ Comment :: String -> ControlCMD (Param3 prog exp pred) () instance HFunctor ControlCMD where@@ -290,6 +292,8 @@ hfmap f (For rng body) = For rng (f . body) hfmap _ Break = Break hfmap _ (Assert cond msg) = Assert cond msg+ hfmap _ (Hint exp) = Hint exp+ hfmap _ (Comment msg) = Comment msg instance HBifunctor ControlCMD where@@ -298,6 +302,8 @@ hbimap f g (For (lo,step,hi) body) = For (g lo, step, fmap g hi) (f . body) hbimap _ _ Break = Break hbimap _ g (Assert cond msg) = Assert (g cond) msg+ hbimap _ g (Hint exp) = Hint (g exp)+ hbimap _ _ (Comment msg) = Comment msg instance (ControlCMD :<: instr) => Reexpressible ControlCMD instr env where@@ -316,6 +322,8 @@ For (lo',step,hi') (flip runReaderT env . body) reexpressInstrEnv reexp Break = lift $ singleInj Break reexpressInstrEnv reexp (Assert cond msg) = lift . singleInj . flip Assert msg =<< reexp cond+ reexpressInstrEnv reexp (Hint exp) = lift . singleInj . Hint =<< reexp exp+ reexpressInstrEnv reexp (Comment msg) = lift $ singleInj (Comment msg) instance DryInterp ControlCMD where@@ -324,7 +332,9 @@ dryInterp (For _ _) = return () dryInterp Break = return () dryInterp (Assert _ _) = return ()-+ dryInterp (Hint _) = return ()+ dryInterp (Comment _) = return ()+ --------------------------------------------------------------------------------@@ -353,18 +363,29 @@ data PtrCMD fs a where- SwapPtr :: IsPointer a => a -> a -> PtrCMD (Param3 prog exp pred) ()+ SwapPtr :: Ptr a -> Ptr a -> PtrCMD (Param3 prog exp pred) ()+ SwapArr :: (Typeable i, Typeable a, pred i, pred a)+ => Arr i a -> Arr i a -> PtrCMD (Param3 prog exp pred) () -instance HFunctor PtrCMD where hfmap _ (SwapPtr a b) = SwapPtr a b-instance HBifunctor PtrCMD where hbimap _ _ (SwapPtr a b) = SwapPtr a b+instance HFunctor PtrCMD+ where+ hfmap _ (SwapPtr a b) = SwapPtr a b+ hfmap _ (SwapArr a b) = SwapArr a b+ +instance HBifunctor PtrCMD+ where+ hbimap _ _ (SwapPtr a b) = SwapPtr a b+ hbimap _ _ (SwapArr a b) = SwapArr a b instance (PtrCMD :<: instr) => Reexpressible PtrCMD instr env where reexpressInstrEnv reexp (SwapPtr a b) = lift $ singleInj (SwapPtr a b)+ reexpressInstrEnv reexp (SwapArr a b) = lift $ singleInj (SwapArr a b) instance DryInterp PtrCMD where dryInterp (SwapPtr _ _) = return ()+ dryInterp (SwapArr _ _) = return () @@ -388,18 +409,18 @@ stdout :: Handle stdout = HandleComp "stdout" -data PrintfArg exp+data PrintfArg exp pred where- PrintfArg :: Printf.PrintfArg a => exp a -> PrintfArg exp+ PrintfArg :: (Printf.PrintfArg a, pred a) => exp a -> PrintfArg exp pred mapPrintfArg- :: (forall a . exp1 a -> exp2 a)- -> PrintfArg exp1 -> PrintfArg exp2+ :: (forall a . pred a => exp1 a -> exp2 a)+ -> PrintfArg exp1 pred -> PrintfArg exp2 pred mapPrintfArg f (PrintfArg exp) = PrintfArg (f exp) mapPrintfArgM :: Monad m- => (forall a . exp1 a -> m (exp2 a))- -> PrintfArg exp1 -> m (PrintfArg exp2)+ => (forall a . pred a => exp1 a -> m (exp2 a))+ -> PrintfArg exp1 pred -> m (PrintfArg exp2 pred) mapPrintfArgM f (PrintfArg exp) = liftM PrintfArg (f exp) -- | Values that can be printed\/scanned using @printf@\/@scanf@@@ -437,10 +458,10 @@ data FileCMD fs a where- FOpen :: FilePath -> IOMode -> FileCMD (Param3 prog exp pred) Handle- FClose :: Handle -> FileCMD (Param3 prog exp pred) ()- FEof :: Handle -> FileCMD (Param3 prog exp pred) (Val Bool)- FPrintf :: Handle -> String -> [PrintfArg exp] -> FileCMD (Param3 prog exp pred) ()+ FOpen :: FilePath -> IOMode -> FileCMD (Param3 prog exp pred) Handle+ FClose :: Handle -> FileCMD (Param3 prog exp pred) ()+ FEof :: Handle -> FileCMD (Param3 prog exp pred) (Val Bool)+ FPrintf :: Handle -> String -> [PrintfArg exp pred] -> FileCMD (Param3 prog exp pred) () FGet :: (pred a, Formattable a) => Handle -> FileCMD (Param3 prog exp pred) (Val a) instance HFunctor FileCMD@@ -573,8 +594,8 @@ data C_CMD fs a where- NewCArr :: (pred a, Integral i, Ix i) => String -> Maybe i -> exp i -> C_CMD (Param3 prog exp pred) (Arr i a)- ConstCArr :: (pred a, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a)+ NewCArr :: (pred a, pred i, Integral i, Ix i) => String -> Maybe i -> exp i -> C_CMD (Param3 prog exp pred) (Arr i a)+ ConstCArr :: (pred a, pred i, Integral i, Ix i) => String -> Maybe i -> [a] -> C_CMD (Param3 prog exp pred) (Arr i a) NewPtr :: pred a => String -> C_CMD (Param3 prog exp pred) (Ptr a) PtrToArr :: Ptr a -> C_CMD (Param3 prog exp pred) (Arr i a) NewObject@@ -751,6 +772,7 @@ runPtrCMD :: PtrCMD (Param3 IO IO pred) a -> IO a runPtrCMD (SwapPtr a b) = runSwapPtr a b+runPtrCMD (SwapArr a b) = runSwapPtr a b runHandle :: Handle -> IO.Handle runHandle (HandleRun h) = h@@ -770,7 +792,7 @@ cs <- readWord h return (c:cs) -runFPrintf :: [PrintfArg IO] -> (forall r . Printf.HPrintfType r => r) -> IO ()+runFPrintf :: [PrintfArg IO pred] -> (forall r . Printf.HPrintfType r => r) -> IO () runFPrintf [] pf = pf runFPrintf (PrintfArg a:as) pf = a >>= \a' -> runFPrintf as (pf a')
src/Language/Embedded/Imperative/Frontend.hs view
@@ -14,6 +14,7 @@ import Data.IORef import Data.Typeable import System.IO.Unsafe+import Data.Constraint import Control.Monad.Operational.Higher import System.IO.Fake@@ -100,7 +101,7 @@ -------------------------------------------------------------------------------- -- | Create an uninitialized array-newArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+newArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => exp i -- ^ Length -> ProgramT instr (Param2 exp pred) m (Arr i a) newArr = newNamedArr "a"@@ -109,14 +110,14 @@ -- -- The provided base name may be appended with a unique identifier to avoid name -- collisions.-newNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+newNamedArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => String -- ^ Base name -> exp i -- ^ Length -> ProgramT instr (Param2 exp pred) m (Arr i a) newNamedArr base len = singleInj (NewArr base len) -- | Create an array and initialize it with a constant list-constArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+constArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => [a] -- ^ Initial contents -> ProgramT instr (Param2 exp pred) m (Arr i a) constArr = constNamedArr "a"@@ -125,7 +126,7 @@ -- -- The provided base name may be appended with a unique identifier to avoid name -- collisions.-constNamedArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+constNamedArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => String -- ^ Base name -> [a] -- ^ Initial contents -> ProgramT instr (Param2 exp pred) m (Arr i a)@@ -134,6 +135,7 @@ -- | Get an element of an array getArr :: ( pred a+ , pred i , FreeExp exp , FreePred exp a , Integral i@@ -145,14 +147,14 @@ getArr arr i = fmap valToExp $ singleInj $ GetArr arr i -- | Set an element of an array-setArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) =>+setArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> exp i -> exp a -> ProgramT instr (Param2 exp pred) m () setArr arr i a = singleInj (SetArr arr i a) -- | Copy the contents of an array to another array. The number of elements to -- copy must not be greater than the number of allocated elements in either -- array.-copyArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr)+copyArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => (Arr i a, exp i) -- ^ (destination,offset) -> (Arr i a, exp i) -- ^ (source,offset -> exp i -- ^ Number of elements@@ -161,7 +163,7 @@ -- | Freeze a mutable array to an immutable one. This involves copying the array -- to a newly allocated one.-freezeArr :: (pred a, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m)+freezeArr :: (pred a, pred i, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m) => Arr i a -> exp i -- ^ Length of new array -> ProgramT instr (Param2 exp pred) m (IArr i a)@@ -173,13 +175,13 @@ -- | Freeze a mutable array to an immutable one without making a copy. This is -- generally only safe if the the mutable array is not updated as long as the -- immutable array is alive.-unsafeFreezeArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) =>+unsafeFreezeArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => Arr i a -> ProgramT instr (Param2 exp pred) m (IArr i a) unsafeFreezeArr arr = singleInj $ UnsafeFreezeArr arr -- | Thaw an immutable array to a mutable one. This involves copying the array -- to a newly allocated one.-thawArr :: (pred a, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m)+thawArr :: (pred a, pred i, Integral i, Ix i, Num (exp i), ArrCMD :<: instr, Monad m) => IArr i a -> exp i -- ^ Number of elements to copy -> ProgramT instr (Param2 exp pred) m (Arr i a)@@ -192,7 +194,7 @@ -- | Thaw an immutable array to a mutable one without making a copy. This is -- generally only safe if the the mutable array is not updated as long as the -- immutable array is alive.-unsafeThawArr :: (pred a, Integral i, Ix i, ArrCMD :<: instr) =>+unsafeThawArr :: (pred a, pred i, Integral i, Ix i, ArrCMD :<: instr) => IArr i a -> ProgramT instr (Param2 exp pred) m (Arr i a) unsafeThawArr arr = singleInj $ UnsafeThawArr arr @@ -259,7 +261,11 @@ -> ProgramT instr (Param2 exp pred) m () assert cond msg = singleInj $ Assert cond msg -+-- | Hint that an expression may be used in an invariant+hint :: (ControlCMD :<: instr, pred a)+ => exp a -- ^ Expression to be used in invariant+ -> ProgramT instr (Param2 exp pred) m ()+hint exp = singleInj $ Hint exp -------------------------------------------------------------------------------- -- * Pointer operations@@ -272,10 +278,13 @@ -- -- The 'IsPointer' class ensures that the operation is only possible for types -- that are represented as pointers in C.-unsafeSwap :: (IsPointer a, PtrCMD :<: instr) =>- a -> a -> ProgramT instr (Param2 exp pred) m ()+unsafeSwap :: (PtrCMD :<: instr) =>+ Ptr a -> Ptr a -> ProgramT instr (Param2 exp pred) m () unsafeSwap a b = singleInj $ SwapPtr a b +unsafeSwapArr :: (Typeable i, Typeable a, pred i, pred a, PtrCMD :<: instr) =>+ Arr i a -> Arr i a -> ProgramT instr (Param2 exp pred) m ()+unsafeSwapArr a b = singleInj $ SwapArr a b --------------------------------------------------------------------------------@@ -299,18 +308,21 @@ class PrintfType r where type PrintfExp r :: * -> *- fprf :: Handle -> String -> [PrintfArg (PrintfExp r)] -> r+ type PrintfPred r :: * -> Constraint+ fprf :: Handle -> String -> [PrintfArg (PrintfExp r) (PrintfPred r)] -> r instance (FileCMD :<: instr, a ~ ()) => PrintfType (ProgramT instr (Param2 exp pred) m a) where type PrintfExp (ProgramT instr (Param2 exp pred) m a) = exp+ type PrintfPred (ProgramT instr (Param2 exp pred) m a) = pred fprf h form as = singleInj $ FPrintf h form (reverse as) -instance (Formattable a, PrintfType r, exp ~ PrintfExp r) =>+instance (Formattable a, PrintfType r, exp ~ PrintfExp r, PrintfPred r a) => PrintfType (exp a -> r) where type PrintfExp (exp a -> r) = exp+ type PrintfPred (exp a -> r) = PrintfPred r fprf h form as = \a -> fprf h form (PrintfArg a : as) -- | Print to a handle. Accepts a variable number of arguments.@@ -319,7 +331,7 @@ -- | Put a single value to a handle fput :: forall instr exp pred a m- . (Formattable a, FreePred exp a, FileCMD :<: instr)+ . (Formattable a, FreePred exp a, FileCMD :<: instr, pred a) => Handle -> String -- ^ Prefix -> exp a -- ^ Expression to print