-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathKeymapList.hs
43 lines (29 loc) · 962 Bytes
/
KeymapList.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-- INF 1 Functional Programming
--
-- Indexed data represented as a list
module KeymapList ( Keymap,
size,
get, set, del,
select,
toList, fromList
)
where
newtype Keymap k a = K [(k,a)]
size :: Eq k => Keymap k a -> Int
size (K xs) = length xs
get :: Eq k => k -> Keymap k a -> Maybe a
get key (K xs) = lookup key xs
set :: Eq k => k -> a -> Keymap k a -> Keymap k a
set key value (K xs) = K (ins xs)
where
ins [] = [(key,value)]
ins ((k,v):xs) | k == key = (k,value) : xs
| otherwise = (k,v) : ins xs
del :: Eq k => k -> Keymap k a -> Keymap k a
del key (K xs) = K (filter ((/=key).fst) xs)
select :: Eq k => (a -> Bool) -> Keymap k a -> Keymap k a
select f (K xs) = K (filter (f.snd) xs)
toList :: Eq k => Keymap k a -> [(k,a)]
toList (K xs) = xs
fromList :: Eq k => [(k,a)] -> Keymap k a
fromList xs = K xs