From e13cc36c8a2ae63784736cfa7ad6cb0b2ac46572 Mon Sep 17 00:00:00 2001 From: totycro Date: Wed, 23 May 2012 10:43:10 +0200 Subject: Only use : instead of ++ for BufferI (constant time instead of linear in the worst case) delete should delete before the cursor, not after --- AufgabeFFP7.hs | 17 +++++++++-------- TestAufgabeFFP7.hs | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/AufgabeFFP7.hs b/AufgabeFFP7.hs index 099eda8..e2a7d65 100644 --- a/AufgabeFFP7.hs +++ b/AufgabeFFP7.hs @@ -20,11 +20,12 @@ insert c (cur, buf) = (min (length buf + 1) (max (cur + 1) 1), buf1 ++ [c] ++ bu -- delete character before cursor delete :: Buffer -> Buffer delete (cur, buf) - | buf2 == "" = (min cur (length buf1), buf1) - | cur < 0 = (0, buf) - | otherwise = (cur, buf1 ++ tail buf2) + | buf2 == "" = (min newCur (length buf1), buf1) + | newCur < 0 = (0, buf) + | otherwise = (newCur, buf1 ++ tail buf2) where - (buf1, buf2) = splitAt cur buf + newCur = cur - 1 + (buf1, buf2) = splitAt newCur buf -- move cursor left one character left :: Buffer -> Buffer @@ -52,22 +53,22 @@ emptyI = ("", "") -- insert character before cursor insertI :: Char -> BufferI -> BufferI -insertI c (beforeC, afterC) = ([c] ++ beforeC, afterC) +insertI c (beforeC, afterC) = (c:beforeC, afterC) -- delete character before cursor deleteI :: BufferI -> BufferI deleteI (beforeC, "") = (beforeC, "") -deleteI (beforeC, c:afterC) = (beforeC, afterC) +deleteI (c:beforeC, afterC) = (beforeC, afterC) -- move cursor left one character leftI :: BufferI -> BufferI leftI ("", afterC) = ("", afterC) -leftI (c:beforeC, afterC) = (beforeC, [c] ++ afterC) +leftI (c:beforeC, afterC) = (beforeC, c:afterC) -- move cursor right one character rightI :: BufferI -> BufferI rightI (beforeC, "") = (beforeC, "") -rightI (beforeC, c:afterC) = ([c] ++ beforeC, afterC) +rightI (beforeC, c:afterC) = (c:beforeC, afterC) -- is cursor at left end? atLeftI :: BufferI -> Bool diff --git a/TestAufgabeFFP7.hs b/TestAufgabeFFP7.hs index bbe3540..376e782 100755 --- a/TestAufgabeFFP7.hs +++ b/TestAufgabeFFP7.hs @@ -23,8 +23,8 @@ cases1 = TestLabel "buffer" $ TestList [ (insert 'b' (100, "a")), TestCase $ assertEqual "delete1" (0, "bc") - (delete (0, "abc")), - TestCase $ assertEqual "delete2" (2, "ab") + (delete (0, "bc")), + TestCase $ assertEqual "delete2" (1, "ac") (delete (2, "abc")), TestCase $ assertEqual "delete3" (0, "abc") (delete (-100, "abc")), -- cgit v1.2.3