Playing around with displaying tape
authorMichael Welch <michaelgwelch@gmail.com>
Sat, 25 Feb 2012 23:43:23 +0000 (17:43 -0600)
committerMichael Welch <michaelgwelch@gmail.com>
Sat, 25 Feb 2012 23:43:23 +0000 (17:43 -0600)
as infinite

This was to be used with program as well, but that is finite
need to consider it further

haskell/showseq.hs [new file with mode: 0644]
haskell/tape.hs

diff --git a/haskell/showseq.hs b/haskell/showseq.hs
new file mode 100644 (file)
index 0000000..fe039b8
--- /dev/null
@@ -0,0 +1,42 @@
+module ShowSeq where
+
+import Data.Sequence as Seq
+import Data.Foldable as F(foldr)
+
+
+-- | Pad the left side of the sequence with the specified
+--   number of values.
+padl :: Int -> a -> Seq a -> Seq a
+padl 0 _ xs = xs
+padl n a xs = padl (n-1) a (a <| xs)
+
+-- | Pad the right side of the sequence with the specified
+--   number of values.
+padr :: Int -> a -> Seq a -> Seq a
+padr 0 _ xs = xs
+padr n a xs = padr (n-1) a (xs |> a)
+
+-- | Truncates on the left to n elements
+truncl :: Int -> Seq a -> Seq a
+truncl n xs = Seq.drop (Seq.length xs - n) xs
+
+-- | Truncates on the right to n elements
+truncr n xs = Seq.take n xs
+
+-- | Splits the sequence into a triple. 
+splitAt3 :: Seq a -> Int -> (Seq a, a, Seq a)
+splitAt3 xs n = (Seq.take n xs, index xs n, Seq.drop (n+1) xs)
+
+-- | Shows the sequence as a tape
+showSeqAsInf :: Seq Int -> Int -> String
+showSeqAsInf xs i = "..., " ++ showSeq left ++ "_" ++ show mid ++
+    "_, " ++ showSeq right ++ "..."
+    where (l,mid,r) = splitAt3 xs i
+          left = (truncl 5 (padl 5 0 l))
+          right = (truncr 5 (padr 5 0 r))
+
+showSeq :: Show a => Seq a -> String
+showSeq xs = F.foldr (\x -> \cs -> show x ++ ", " ++ cs) "" xs
+
+
+
index 9bf4af6..6925ef1 100644 (file)
@@ -3,10 +3,12 @@
 --   each of which contain a number. The tape also has a /cursor/ which
 --   keeps track of the /current/ cell. The current cell is the one that
 --   all of the functions in this module operate on.
-module Tape(Tape(), tape, createTape, moveF, moveR, get, set, inc, dec) where
+module Tape(Tape(), tape, createTape, moveF, moveR, get, set, inc, dec,
+    showTape) where
 
 import Data.Sequence as Seq
-import Data.Foldable (toList)
+import Data.Foldable as F (toList, foldr)
+import ShowSeq
 
 -- | Represents an infinte list of cells containing numbers.
 data Tape = Tape (Seq Int) Int deriving (Eq, Show)
@@ -50,3 +52,16 @@ inc t = set t $ (get t) + 1
 dec :: Tape -> Tape
 dec t = set t $ (get t) - 1
 
+-- | Shows the sequence as a tape
+showTape :: Tape -> String
+showTape (Tape xs i) = showSeqAsInf xs i
+{-showTape :: Tape -> String
+showTape (Tape xs i) = "..., " ++ showSeq left ++ "_" ++ show mid ++
+    "_, " ++ showSeq right ++ "..."
+    where (l,mid,r) = splitAt3 xs i
+          left = (truncl 5 (padl 5 0 l))
+          right = (truncr 5 (padr 5 0 r))
+-}
+--showSeq :: Show a => Seq a -> String
+--showSeq xs = F.foldr (\x -> \cs -> show x ++ ", " ++ cs) "" xs
+