Add show method for Tape and check index on createTape
authorMichael Welch <michaelgwelch@gmail.com>
Sun, 19 Feb 2012 23:37:31 +0000 (17:37 -0600)
committerMichael Welch <michaelgwelch@gmail.com>
Sun, 19 Feb 2012 23:37:31 +0000 (17:37 -0600)
haskell/tape.hs

index 3a57579..de7c795 100644 (file)
@@ -1,18 +1,20 @@
 module Tape(Tape(), tape, createTape, moveF, moveR, get, set, inc, dec) where
 
-import Data.Sequence 
-import Prelude hiding (length)
+import Data.Sequence as Seq
+import Data.Foldable (toList)
 
-data Tape = Tape (Seq Int) Int deriving (Show, Eq)
+data Tape = Tape (Seq Int) Int deriving (Eq)
 
 tape :: Tape
 tape = Tape (singleton 0) 0
 
-createTape :: [Int] -> Tape
-createTape = (flip Tape) 0 . fromList
+createTape :: [Int] -> Int -> Tape
+createTape xs p | p < 0 = error "createTape: p is less than 0"
+                | p >= (Prelude.length xs) = error "createTape: p is too large"
+                | otherwise = Tape (fromList xs) p
 
 moveF :: Tape -> Tape 
-moveF (Tape xs pos) | pos >= ((length xs) - 1) = (Tape (xs |> 0) (pos + 1))
+moveF (Tape xs pos) | pos >= ((Seq.length xs) - 1) = (Tape (xs |> 0) (pos + 1))
                     | otherwise = Tape xs (pos + 1)
 
 moveR :: Tape -> Tape 
@@ -31,3 +33,6 @@ inc t = set t $ (get t) + 1
 dec :: Tape -> Tape
 dec t = set t $ (get t) - 1
 
+
+instance Show Tape where
+    show (Tape xs p) = "At index " ++ show p ++ " in " ++ show (toList xs)