dd51a94951b408596506332e035412e120e5445c
[fp1415.git] / week3 / camil / StdStack.icl
1 implementation module StdStack
2
3 import StdEnv
4 import StdList
5
6 :: Stack a :== [a]
7
8 newStack :: (Stack a)
9 newStack = []
10
11 push :: a (Stack a) -> (Stack a)
12 push a s = [a] ++ s
13
14 pop :: (Stack a) -> (Stack a)
15 pop [a:s] = s
16 pop [] = []
17
18 popn :: Int (Stack a) -> (Stack a)
19 popn 0 s = s
20 popn n s = popn (n-1) (pop s)
21
22 pushes :: [a] (Stack a) -> (Stack a)
23 pushes [] s = s
24 pushes a s = pushes (tl a) (push (hd a) s)
25
26 top :: (Stack a) -> a
27 top [] = abort "`top s` with s = []"
28 top s = hd s
29
30 topn :: Int (Stack a) -> [a]
31 topn n s
32 | n > length s = abort "`topn n s` with n > length s"
33 | otherwise = take n s
34
35 count :: (Stack a) -> Int
36 count s = length s
37
38 elements :: (Stack a) -> [a]
39 elements s = s
40
41 Start = ( "s0 = newStack = ", s0,'\n'
42 , "s1 = push 1 s0 = ", s1,'\n'
43 , "s2 = pushes [2..5] s1 = ",s2,'\n'
44 , "s3 = pop s2 = ", s3,'\n'
45 , "s4 = popn 3 s3 = ", s4,'\n'
46 , "s5 = top s4 = ", s5,'\n'
47 , "s6 = topn 3 s2 = ", s6,'\n'
48 , "s7 = elements s2 = ", s7,'\n'
49 // , "s8 = push 10 s1 = ", s8,'\n'
50 // , "s9 = popn 10 s8 = ", s9,'\n'
51 // , "sa = topn 5 s4 = ", sa,'\n'
52 // , "sb = top s0 = ", sb,'\n'
53 )
54 where
55 s0 = newStack
56 s1 = push 1 s0
57 s2 = pushes [2..5] s1
58 s3 = pop s2
59 s4 = popn 3 s3
60 s5 = top s4
61 s6 = topn 3 s2
62 s7 = elements s2
63 // s8 = push 10 s1
64 // s9 = popn 10 s8
65 // sa = topn 5 s4
66 // sb = top s0