Refactor execute out of Program module
authorMichael Welch <michaelgwelch@gmail.com>
Mon, 20 Feb 2012 03:49:09 +0000 (21:49 -0600)
committerMichael Welch <michaelgwelch@gmail.com>
Mon, 20 Feb 2012 03:49:09 +0000 (21:49 -0600)
haskell/execute.hs [new file with mode: 0644]
haskell/prog.hs [new file with mode: 0644]
haskell/program.hs

diff --git a/haskell/execute.hs b/haskell/execute.hs
new file mode 100644 (file)
index 0000000..1085c66
--- /dev/null
@@ -0,0 +1,25 @@
+module Execute where
+
+import Prog
+import Tape
+import Data.Char
+
+execute :: Prog a => Char -> a -> Tape -> IO Char -> (Char -> IO ()) 
+           -> IO (a, Tape)
+execute '>' p t _ _ = return (p, moveF t)
+execute '<' p t _ _ = return (p, moveR t)
+execute '+' p t _ _ = return (p, inc t)
+execute '-' p t _ _ = return (p, dec t)
+execute '.' p t _ o = do
+                    o $ chr $ get t
+                    return (p, t)
+execute ',' p t i _ = do
+                    c <- i 
+                    let t' = set t $ ord c
+                    return (p, t')
+execute '[' p t _  _= if ((get t) == 0) then return ((jumpF p), t) 
+                  else return (p, t)
+execute ']' p t _ _ = if ((get t) /= 0) then return ((jumpB p), t)
+                  else return (p, t)
+execute _ p t _ _ = return (p, t)
+
diff --git a/haskell/prog.hs b/haskell/prog.hs
new file mode 100644 (file)
index 0000000..11ae52d
--- /dev/null
@@ -0,0 +1,4 @@
+module Prog where
+class Prog a where
+    jumpF :: a -> a
+    jumpB :: a -> a
index 4854744..b1f3543 100644 (file)
@@ -1,5 +1,7 @@
 module Program(createProgram, endOfProgram, fetch, run) where
+import Prog
 import Tape
+import Execute
 import Data.Char
 import Data.Sequence
 import Prelude hiding (length, take, drop)
@@ -42,24 +44,6 @@ matchBackward (cs :> '[') p n = matchBackward (viewr cs) (p-1) (n-1)
 matchBackward (cs :> ']') p n = matchBackward (viewr cs) (p-1) (n+1)
 matchBackward (cs :> _) p n = matchBackward (viewr cs) (p-1) n
 
-execute :: Char -> Program -> Tape -> IO Char -> (Char -> IO ()) 
-           -> IO (Program, Tape)
-execute '>' p t _ _ = return (p, moveF t)
-execute '<' p t _ _ = return (p, moveR t)
-execute '+' p t _ _ = return (p, inc t)
-execute '-' p t _ _ = return (p, dec t)
-execute '.' p t _ o = do
-                    o $ chr $ get t
-                    return (p, t)
-execute ',' p t i _ = do
-                    c <- i 
-                    let t' = set t $ ord c
-                    return (p, t')
-execute '[' p t _  _= if ((get t) == 0) then return ((jumpForward p), t) 
-                  else return (p, t)
-execute ']' p t _ _ = if ((get t) /= 0) then return ((jumpBackward p), t)
-                  else return (p, t)
-execute _ p t _ _ = return (p, t)
 
 run :: Program -> Tape -> IO (Program, Tape)
 run p t | (endOfProgram p) = return (p, t)
@@ -68,3 +52,7 @@ run p t = do
             (p'',t') <- execute i p' t getChar putChar
             run p'' t'
 
+
+instance Prog Program where
+    jumpF = jumpForward
+    jumpB = jumpBackward