summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortotycro <totycro@unknown-horizons.org>2012-05-22 01:56:30 +0200
committertotycro <totycro@unknown-horizons.org>2012-05-22 01:56:30 +0200
commitf3dcc58593dd0e8330410970b51a4ab5ad21f952 (patch)
treec5b3dd861ba3e4d61cb64f24340c1cda88ab968b
parenta6141793949e97c818523453f9c8fc8bf3c5194f (diff)
downloadffp-f3dcc58593dd0e8330410970b51a4ab5ad21f952.tar.gz
ffp-f3dcc58593dd0e8330410970b51a4ab5ad21f952.tar.bz2
ffp-f3dcc58593dd0e8330410970b51a4ab5ad21f952.zip
Teil 1 von Teil 1 von 7
-rw-r--r--AufgabeFFP7.hs49
1 files 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
2where 2where
3 3
4import Data.Char 4import Data.Char
5import Data.List hiding ((\\)) 5import Data.List hiding ((\\), insert)
6import Test.QuickCheck 6import Test.QuickCheck
7 7
8type Buffer = (Int, String) 8type Buffer = (Int, String)
@@ -47,33 +47,66 @@ atRight (cur, buf) = cur >= length buf
47type BufferI = (String, String) 47type BufferI = (String, String)
48 48
49-- the empty buffer 49-- the empty buffer
50--TODO emptyI :: BufferI 50emptyI :: BufferI
51emptyI = ("", "")
51 52
52-- insert character before cursor 53-- insert character before cursor
53--TODO insertI :: Char -> BufferI -> BufferI 54insertI :: Char -> BufferI -> BufferI
55insertI c (beforeC, afterC) = ([c] ++ beforeC, afterC)
54 56
55-- delete character before cursor 57-- delete character before cursor
56--TODO deleteI :: BufferI -> BufferI 58--TODO deleteI :: BufferI -> BufferI
57 59
58-- move cursor left one character 60-- move cursor left one character
59--TODO leftI :: BufferI -> BufferI 61leftI :: BufferI -> BufferI
62leftI ([], afterC) = ([], afterC)
63leftI (last:beforeC, afterC) = (beforeC, [last] ++ afterC)
60 64
61-- move cursor right one character 65-- move cursor right one character
62--TODO rightI :: BufferI -> BufferI 66--TODO rightI :: BufferI -> BufferI
63 67
64-- is cursor at left end? 68-- is cursor at left end?
65--TODO atLeftI :: BufferI -> Bool 69atLeftI :: BufferI -> Bool
70atLeftI ([], _) = True
71atLeftI (_, _) = False
66 72
67-- is cursor at right end? 73-- is cursor at right end?
68--TODO atRightI :: BufferI -> Bool 74atRightI :: BufferI -> Bool
75atRightI (_, []) = True
76atRightI (_, _) = False
77
69 78
70-------------------------------------------------------------------------------- 79--------------------------------------------------------------------------------
71 80
72--TODO retrieve :: BufferI -> Buffer 81retrieve :: BufferI -> Buffer
82retrieve (beforeC, afterC) = (length beforeC, (reverse beforeC) ++ afterC)
73 83
74-------------------------------------------------------------------------------- 84--------------------------------------------------------------------------------
75 85
76--TODO: quicheck stuff 86-- quickcheck Buffer == BufferI
87
88bufEqual :: BufferI -> Buffer -> Bool
89bufEqual bi b = (retrieve bi) == b
90
91-- generator for equal data
92genEqualBuf :: Gen(Buffer, BufferI)
93genEqualBuf = do s <- arbitrary ; c <- choose (0, length s) ; return ( (c, s), revFst (splitAt c s) )
94 where
95 revFst = \(a, b) -> (reverse a, b)
96
97instance Arbitrary Char where
98 arbitrary = elements $ ['a'..'z'] ++ ['A'..'Z']
99
100-- naive insert test, will exhaust
101prop_insert :: BufferI -> Buffer -> Char -> Property
102prop_insert bi b c = bufEqual bi b
103 ==> bufEqual (insertI c bi) (insert c b)
104
105-- use equal data generator
106prop_insert2 :: Char -> Property
107prop_insert2 c =
108 forAll (genEqualBuf) $ \(b, bi) -> bufEqual (insertI c bi) (insert c b)
109
77 110
78-------------------------------------------------------------------------------- 111--------------------------------------------------------------------------------
79 112