cmonad 0.1.0.1 → 0.1.1.0
raw patch · 5 files changed
+41/−20 lines, 5 files
Files
- cmonad.cabal +2/−2
- examples/Makefile +6/−14
- src/Language/CMonad/MonadRef.hs +9/−2
- src/Language/CMonad/Ops.hs +22/−0
- src/Language/CMonad/Prim.hs +2/−2
cmonad.cabal view
@@ -1,5 +1,5 @@ Name: cmonad-Version: 0.1.0.1+Version: 0.1.1.0 License: BSD3 Author: Lennart Augustsson Maintainer: Lennart Augustsson@@ -7,7 +7,7 @@ Synopsis: A library for C-like programming Stability: experimental Build-type: Simple-Description: A library for C-like programming+Description: A library for C-like programming. The code looks imperative, and you might think it would be efficient, but GHC lacks certain optimizations that makes it very slow. Hs-Source-Dirs: src Build-Depends: base, array Exposed-modules:
examples/Makefile view
@@ -1,22 +1,14 @@ GHC=ghc GHCFLAGS= -O --make -i../src -odir build -hidir build -run: Inf.run QSort.run--build:- mkdir -p build--Inf.run: Inf.exe- ./Inf.exe--Inf.exe: build Inf.hs- $(GHC) $(GHCFLAGS) -main-is Inf.main Inf.hs -o Inf.exe+run: Fac.run Fib.run Inf.run QSort.run Array2.run Cat.run -QSort.run: QSort.exe- ./QSort.exe+.SUFFIXES: .hs .run -QSort.exe: build QSort.hs- $(GHC) $(GHCFLAGS) -main-is QSort.main QSort.hs -o QSort.exe+.hs.run:+ @mkdir -p build+ $(GHC) $(GHCFLAGS) -main-is $*.main $*.hs -o $*.exe+ echo Hello | ./$*.exe clean: rm -rf *.exe* build
src/Language/CMonad/MonadRef.hs view
@@ -1,8 +1,10 @@-{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, KindSignatures #-} module Language.CMonad.MonadRef where+import Control.Monad.ST import Data.IORef import Data.STRef-import Control.Monad.ST(ST)+import Data.Array.ST+import Data.Array.IO class (Monad m) => MonadRef m r | m -> r, r -> m where newRef :: a -> m (r a)@@ -24,3 +26,8 @@ readRef = readSTRef {-# INLINE writeRef #-} writeRef = writeSTRef++class TheArray (m :: * -> *) (arr :: * -> * -> *) | m -> arr++instance TheArray IO IOArray+instance TheArray (ST s) (STArray s)
src/Language/CMonad/Ops.hs view
@@ -3,6 +3,7 @@ -- XXX Despite what I think should be enough LANGUAGE options I still need -fglasgow-exts. module Language.CMonad.Ops(module Language.CMonad.Ops) where import qualified Prelude as P+import System.IO import Language.CMonad.CPrelude import Language.CMonad.MonadRef(MonadRef) import Language.CMonad.Prim@@ -89,6 +90,9 @@ y =: t return () +autoU :: (MonadRef m r) => E m (forall v . E' v m a)+autoU = auto undefined+ ----------------------------- while :: (Monad m) => E m Bool -> E m a -> E m ()@@ -129,3 +133,21 @@ {-# INLINE retrn #-} retrn :: E m a -> E m a retrn x = x++-----------------------------++type EIO a = E IO a++getchar :: () -> EIO Int+getchar () = embed $ do+ eof <- hIsEOF stdin+ if eof then+ return (-1)+ else+ fmap fromEnum $ hGetChar stdin+ +putchar :: EIO Int -> EIO Int+putchar c = embed $ do+ c' <- runE c+ hPutChar stdout (toEnum c')+ return 0
src/Language/CMonad/Prim.hs view
@@ -60,7 +60,7 @@ ) -- |A un-initialized multi-dimensional array. E.g., @arrayU [2,3]@ is a 2x3 array.-arrayU :: forall arr m a i . (Ix i, Num i, MArray arr a m) =>+arrayU :: forall arr m a i . (Ix i, Num i, MArray arr a m, TheArray m arr) => [E m i] -> E m (forall v . [E m i] -> E' v m a) arrayU ss = E ( do ss' <- mapM runE ss@@ -77,7 +77,7 @@ ) -- |An C array initialized with a normal array.-arrayA :: forall arr m a i . (Ix i, MArray arr a m) =>+arrayA :: forall arr m a i . (Ix i, MArray arr a m, TheArray m arr) => Array i a -> E m (forall v . [E m i] -> E' v m a) arrayA aa = E ( do a <- thaw aa :: m (arr i a)