From f3dcc58593dd0e8330410970b51a4ab5ad21f952 Mon Sep 17 00:00:00 2001 From: totycro Date: Tue, 22 May 2012 01:56:30 +0200 Subject: Teil 1 von Teil 1 von 7 --- AufgabeFFP7.hs | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/AufgabeFFP7.hs b/AufgabeFFP7.hs index 13f1448..fc9d594 100644 --- a/AufgabeFFP7.hs +++ b/AufgabeFFP7.hs @@ -2,7 +2,7 @@ module AufgabeFFP7 where import Data.Char -import Data.List hiding ((\\)) +import Data.List hiding ((\\), insert) import Test.QuickCheck type Buffer = (Int, String) @@ -47,33 +47,66 @@ atRight (cur, buf) = cur >= length buf type BufferI = (String, String) -- the empty buffer ---TODO emptyI :: BufferI +emptyI :: BufferI +emptyI = ("", "") -- insert character before cursor ---TODO insertI :: Char -> BufferI -> BufferI +insertI :: Char -> BufferI -> BufferI +insertI c (beforeC, afterC) = ([c] ++ beforeC, afterC) -- delete character before cursor --TODO deleteI :: BufferI -> BufferI -- move cursor left one character ---TODO leftI :: BufferI -> BufferI +leftI :: BufferI -> BufferI +leftI ([], afterC) = ([], afterC) +leftI (last:beforeC, afterC) = (beforeC, [last] ++ afterC) -- move cursor right one character --TODO rightI :: BufferI -> BufferI -- is cursor at left end? ---TODO atLeftI :: BufferI -> Bool +atLeftI :: BufferI -> Bool +atLeftI ([], _) = True +atLeftI (_, _) = False -- is cursor at right end? ---TODO atRightI :: BufferI -> Bool +atRightI :: BufferI -> Bool +atRightI (_, []) = True +atRightI (_, _) = False + -------------------------------------------------------------------------------- ---TODO retrieve :: BufferI -> Buffer +retrieve :: BufferI -> Buffer +retrieve (beforeC, afterC) = (length beforeC, (reverse beforeC) ++ afterC) -------------------------------------------------------------------------------- ---TODO: quicheck stuff +-- quickcheck Buffer == BufferI + +bufEqual :: BufferI -> Buffer -> Bool +bufEqual bi b = (retrieve bi) == b + +-- generator for equal data +genEqualBuf :: Gen(Buffer, BufferI) +genEqualBuf = do s <- arbitrary ; c <- choose (0, length s) ; return ( (c, s), revFst (splitAt c s) ) + where + revFst = \(a, b) -> (reverse a, b) + +instance Arbitrary Char where + arbitrary = elements $ ['a'..'z'] ++ ['A'..'Z'] + +-- naive insert test, will exhaust +prop_insert :: BufferI -> Buffer -> Char -> Property +prop_insert bi b c = bufEqual bi b + ==> bufEqual (insertI c bi) (insert c b) + +-- use equal data generator +prop_insert2 :: Char -> Property +prop_insert2 c = + forAll (genEqualBuf) $ \(b, bi) -> bufEqual (insertI c bi) (insert c b) + -------------------------------------------------------------------------------- -- cgit v1.2.3