From 483112fdf522550e852c45a09e73fd3120b161be Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Fri, 4 Dec 2015 18:47:34 +0100 Subject: better cleanup --- ws2015/ffp/blaetter/07/FFP_U07_Monaden2.hs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'ws2015') diff --git a/ws2015/ffp/blaetter/07/FFP_U07_Monaden2.hs b/ws2015/ffp/blaetter/07/FFP_U07_Monaden2.hs index 18eacfa..8e92dee 100644 --- a/ws2015/ffp/blaetter/07/FFP_U07_Monaden2.hs +++ b/ws2015/ffp/blaetter/07/FFP_U07_Monaden2.hs @@ -278,18 +278,19 @@ type MM = Map ([Monster], [Monster]) Double -- MM stands for MonsterManual memoWinchance :: [Monster] -> [Monster] -> Double memoWinchance atts defs = runST (newSTRef Map.empty >>= memoWinchance' atts defs) - where - memoWinchance' [] _ _ = return 0 -- We do this here so we don't clutter our manual with entries for empty lists - memoWinchance' _ [] _ = return 1 - memoWinchance' atts defs mmRef = recall >>= fromMaybeM (winchance >>= memoize) +memoWinchance' :: forall s. [Monster] -> [Monster] -> STRef s MM -> ST s Double +memoWinchance' [] _ _ = return 0 -- We do this here so we don't clutter our manual with entries for empty lists +memoWinchance' _ [] _ = return 1 +memoWinchance' atts defs mmRef = recall >>= fromMaybeM (winchance >>= memoize) + where recall = Map.lookup (atts, defs) <$> readSTRef mmRef memoize x = modifySTRef mmRef (Map.insert (atts, defs) x) >> return x winchance = winchance' atts defs mmRef - fromMaybeM x Nothing = x fromMaybeM _ (Just x) = return x + winchance' :: forall s. [Monster] -> [Monster] -> STRef s MM -> ST s Double winchance' allatts@(a:atts) alldefs@(d:defs) mmRef | hitpoints a <= 0 = memoWinchance' atts alldefs mmRef | hitpoints d <= 0 = memoWinchance' allatts defs mmRef -- cgit v1.2.3