+-- -- | Step generator A until a multiple of 8.
+-- genB' :: Word64 -> Word64
+-- genB' x = let y = genB x in if y .&. 7 == 0 then y else genB' y
+
+-- -- | One step of both generators A and B.
+-- gen :: (Word64, Word64) -> (Word64, Word64)
+-- gen = genA *** genB
+
+-- -- | Step both generators A and B until a multiple of 4 and 8 respectively.
+-- gen' :: (Word64, Word64) -> (Word64, Word64)
+-- gen' = genA' *** genB'
+
+-- -- | prop> count p f x n == length (filter p . take n . tail $ iterate f x)
+-- count :: (a -> Bool) -> (a -> a) -> a -> Int -> Int
+-- count p f = count' 0 where
+-- count' !k x 0 = k
+-- count' !k x n = count' (if p y then k + 1 else k) y (n - 1) where y = f x
+
+-- day15a :: String -> Int
+-- day15a input =
+-- count (uncurry ((==) `on` (.&. 0xffff))) gen (parse input) 40000000
+
+-- day15b :: String -> Int
+-- day15b input =
+-- count (uncurry ((==) `on` (.&. 0xffff))) gen' (parse input) 5000000