Convert from using [Int] to Seq Int for the tape.
authorMichael Welch <michaelgwelch@gmail.com>
Sun, 19 Feb 2012 04:47:28 +0000 (22:47 -0600)
committerMichael Welch <michaelgwelch@gmail.com>
Sun, 19 Feb 2012 04:47:28 +0000 (22:47 -0600)
haskell/tape.hs

index 1e09907..a535e1d 100644 (file)
@@ -1,34 +1,30 @@
 module Tape where
 
+import Data.Sequence
 -- naive approach that just uses a regular list.
 
-data ListTraveler = Iterate [Int] Int deriving (Show, Eq)
+data ListTraveler = Iterate (Seq Int) Int deriving (Show, Eq)
 
 traveler :: ListTraveler
-traveler = Iterate [0] 0
+traveler = Iterate (singleton 0) 0
 
 moveNext :: ListTraveler -> ListTraveler 
-moveNext (Iterate xs pos) | pos >= ((length xs) - 1) = (Iterate (xs ++ [0]) (pos + 1))
+moveNext (Iterate xs pos) | pos >= ((Data.Sequence.length xs) - 1) = (Iterate (xs |> 0) (pos + 1))
                           | otherwise = Iterate xs (pos + 1)
 
 movePrev :: ListTraveler -> ListTraveler 
-movePrev (Iterate xs pos) | pos == 0 = Iterate (0 : xs) 0
+movePrev (Iterate xs pos) | pos == 0 = Iterate (0 <| xs) 0
                           | otherwise = Iterate xs (pos - 1)
 
 getCurrent :: ListTraveler -> Int
-getCurrent (Iterate xs pos) = xs !! pos
+getCurrent (Iterate xs pos) = index xs pos
 
 setCurrent :: ListTraveler -> Int -> ListTraveler
-setCurrent (Iterate xs pos) val | pos == 0 = Iterate (val : tail xs) pos
-                                | otherwise = 
-                                    Iterate (prefix ++ [val] ++ suffix) pos
-                                  where prefix = take pos xs
-                                        suffix = drop (pos+1) xs
-
+setCurrent (Iterate xs pos) val = (Iterate (update pos val xs) pos)
 
 data Tape = Tape ListTraveler deriving (Show, Eq)
 
-createTape :: [Int] -> Int -> Tape
+createTape :: Seq Int -> Int -> Tape
 createTape is pos = Tape (Iterate is pos)
 tape :: Tape
 tape = Tape traveler