I'm using vertices and a Data.Map.Strict, where I need to implement a capture move for the game Checkers. cMove is supposed to take a vertex k and a list of vertices ks and a map myMap. cMove needs to check if the new vertex (the position which k will get when it jumps over a vertex in ks) is in myMap, as myMap contains the positions of all the pieces on the board. k and k1 (a vertex in ks) should be removed from myMap and the new vertex should be inserted into myMap, where the new vertex should be used to check the next vertex in ks and so on, till there are no more elements in the list. I have tried this:
type Key = (Integer, Integer)
cMove :: Key -> [Key] -> Map Key Bool -> Map Key Bool
cMove k ks myMap = foldr cMoves' myMap ks
where
cMoves' :: Key -> Map Key Bool -> Map Key Bool
cMoves' k1 myMap = case M.lookup k' myMap of
Nothing -> M.insert k' False (M.delete k myMap)
Just x -> myMap
where
k' = (2 * fst k1 - fst k, 2 * snd k1 - snd k)
which iterates through the list k1 as supposed and inserts the new vertex. The problem here is, that k1 is not getting removed and the new vertex is not used instead of k. How do I achieve this?
If any part of my question seems vague, don't hesitate to let me know.
If I understand the question right, you want to change
ktok'from iteration to iteration. You can do that by changing the state of your fold to includekas well: