diff options
| author | totycro <totycro@unknown-horizons.org> | 2012-05-23 10:43:10 +0200 |
|---|---|---|
| committer | totycro <totycro@unknown-horizons.org> | 2012-05-23 10:43:10 +0200 |
| commit | e13cc36c8a2ae63784736cfa7ad6cb0b2ac46572 (patch) | |
| tree | 464bd8122737cdbe0c817101e4af968f4f089541 | |
| parent | 9ce708481e2e7a6de542383da71c715fe69380c1 (diff) | |
| download | ffp-e13cc36c8a2ae63784736cfa7ad6cb0b2ac46572.tar.gz ffp-e13cc36c8a2ae63784736cfa7ad6cb0b2ac46572.tar.bz2 ffp-e13cc36c8a2ae63784736cfa7ad6cb0b2ac46572.zip | |
Only use : instead of ++ for BufferI (constant time instead of linear in the worst case)
delete should delete before the cursor, not after
| -rw-r--r-- | AufgabeFFP7.hs | 17 | ||||
| -rwxr-xr-x | 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 | |||
| 20 | -- delete character before cursor | 20 | -- delete character before cursor |
| 21 | delete :: Buffer -> Buffer | 21 | delete :: Buffer -> Buffer |
| 22 | delete (cur, buf) | 22 | delete (cur, buf) |
| 23 | | buf2 == "" = (min cur (length buf1), buf1) | 23 | | buf2 == "" = (min newCur (length buf1), buf1) |
| 24 | | cur < 0 = (0, buf) | 24 | | newCur < 0 = (0, buf) |
| 25 | | otherwise = (cur, buf1 ++ tail buf2) | 25 | | otherwise = (newCur, buf1 ++ tail buf2) |
| 26 | where | 26 | where |
| 27 | (buf1, buf2) = splitAt cur buf | 27 | newCur = cur - 1 |
| 28 | (buf1, buf2) = splitAt newCur buf | ||
| 28 | 29 | ||
| 29 | -- move cursor left one character | 30 | -- move cursor left one character |
| 30 | left :: Buffer -> Buffer | 31 | left :: Buffer -> Buffer |
| @@ -52,22 +53,22 @@ emptyI = ("", "") | |||
| 52 | 53 | ||
| 53 | -- insert character before cursor | 54 | -- insert character before cursor |
| 54 | insertI :: Char -> BufferI -> BufferI | 55 | insertI :: Char -> BufferI -> BufferI |
| 55 | insertI c (beforeC, afterC) = ([c] ++ beforeC, afterC) | 56 | insertI c (beforeC, afterC) = (c:beforeC, afterC) |
| 56 | 57 | ||
| 57 | -- delete character before cursor | 58 | -- delete character before cursor |
| 58 | deleteI :: BufferI -> BufferI | 59 | deleteI :: BufferI -> BufferI |
| 59 | deleteI (beforeC, "") = (beforeC, "") | 60 | deleteI (beforeC, "") = (beforeC, "") |
| 60 | deleteI (beforeC, c:afterC) = (beforeC, afterC) | 61 | deleteI (c:beforeC, afterC) = (beforeC, afterC) |
| 61 | 62 | ||
| 62 | -- move cursor left one character | 63 | -- move cursor left one character |
| 63 | leftI :: BufferI -> BufferI | 64 | leftI :: BufferI -> BufferI |
| 64 | leftI ("", afterC) = ("", afterC) | 65 | leftI ("", afterC) = ("", afterC) |
| 65 | leftI (c:beforeC, afterC) = (beforeC, [c] ++ afterC) | 66 | leftI (c:beforeC, afterC) = (beforeC, c:afterC) |
| 66 | 67 | ||
| 67 | -- move cursor right one character | 68 | -- move cursor right one character |
| 68 | rightI :: BufferI -> BufferI | 69 | rightI :: BufferI -> BufferI |
| 69 | rightI (beforeC, "") = (beforeC, "") | 70 | rightI (beforeC, "") = (beforeC, "") |
| 70 | rightI (beforeC, c:afterC) = ([c] ++ beforeC, afterC) | 71 | rightI (beforeC, c:afterC) = (c:beforeC, afterC) |
| 71 | 72 | ||
| 72 | -- is cursor at left end? | 73 | -- is cursor at left end? |
| 73 | atLeftI :: BufferI -> Bool | 74 | 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 [ | |||
| 23 | (insert 'b' (100, "a")), | 23 | (insert 'b' (100, "a")), |
| 24 | 24 | ||
| 25 | TestCase $ assertEqual "delete1" (0, "bc") | 25 | TestCase $ assertEqual "delete1" (0, "bc") |
| 26 | (delete (0, "abc")), | 26 | (delete (0, "bc")), |
| 27 | TestCase $ assertEqual "delete2" (2, "ab") | 27 | TestCase $ assertEqual "delete2" (1, "ac") |
| 28 | (delete (2, "abc")), | 28 | (delete (2, "abc")), |
| 29 | TestCase $ assertEqual "delete3" (0, "abc") | 29 | TestCase $ assertEqual "delete3" (0, "abc") |
| 30 | (delete (-100, "abc")), | 30 | (delete (-100, "abc")), |
