module Data.Memoizer.Commands
( CmdMemoizer
, empty
, storeResult
, deleteResult
, lookup
, restart
, nextCmd
)
where
import Prelude hiding (lookup)
import qualified Data.IntMap as Map
data CmdMemoizer a b = CmdMemoizer
{ forall a b. CmdMemoizer a b -> IntMap (a, b)
memoizerMap :: Map.IntMap (a,b)
, forall a b. CmdMemoizer a b -> Int
currentIndex :: Int
, forall a b. CmdMemoizer a b -> Bool
foundModif :: Bool
}
deriving (Int -> CmdMemoizer a b -> ShowS
[CmdMemoizer a b] -> ShowS
CmdMemoizer a b -> String
(Int -> CmdMemoizer a b -> ShowS)
-> (CmdMemoizer a b -> String)
-> ([CmdMemoizer a b] -> ShowS)
-> Show (CmdMemoizer a b)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a b. (Show a, Show b) => Int -> CmdMemoizer a b -> ShowS
forall a b. (Show a, Show b) => [CmdMemoizer a b] -> ShowS
forall a b. (Show a, Show b) => CmdMemoizer a b -> String
$cshowsPrec :: forall a b. (Show a, Show b) => Int -> CmdMemoizer a b -> ShowS
showsPrec :: Int -> CmdMemoizer a b -> ShowS
$cshow :: forall a b. (Show a, Show b) => CmdMemoizer a b -> String
show :: CmdMemoizer a b -> String
$cshowList :: forall a b. (Show a, Show b) => [CmdMemoizer a b] -> ShowS
showList :: [CmdMemoizer a b] -> ShowS
Show, CmdMemoizer a b -> CmdMemoizer a b -> Bool
(CmdMemoizer a b -> CmdMemoizer a b -> Bool)
-> (CmdMemoizer a b -> CmdMemoizer a b -> Bool)
-> Eq (CmdMemoizer a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b.
(Eq a, Eq b) =>
CmdMemoizer a b -> CmdMemoizer a b -> Bool
$c== :: forall a b.
(Eq a, Eq b) =>
CmdMemoizer a b -> CmdMemoizer a b -> Bool
== :: CmdMemoizer a b -> CmdMemoizer a b -> Bool
$c/= :: forall a b.
(Eq a, Eq b) =>
CmdMemoizer a b -> CmdMemoizer a b -> Bool
/= :: CmdMemoizer a b -> CmdMemoizer a b -> Bool
Eq)
empty :: CmdMemoizer a b
empty :: forall a b. CmdMemoizer a b
empty = IntMap (a, b) -> Int -> Bool -> CmdMemoizer a b
forall a b. IntMap (a, b) -> Int -> Bool -> CmdMemoizer a b
CmdMemoizer IntMap (a, b)
forall a. IntMap a
Map.empty Int
0 Bool
False
restart :: CmdMemoizer a b -> CmdMemoizer a b
restart :: forall a b. CmdMemoizer a b -> CmdMemoizer a b
restart CmdMemoizer a b
m = CmdMemoizer a b
m {currentIndex = 0, foundModif = False}
storeResult :: a -> b -> CmdMemoizer a b -> CmdMemoizer a b
storeResult :: forall a b. a -> b -> CmdMemoizer a b -> CmdMemoizer a b
storeResult a
a b
b (CmdMemoizer IntMap (a, b)
m Int
i Bool
_) =
IntMap (a, b) -> Int -> Bool -> CmdMemoizer a b
forall a b. IntMap (a, b) -> Int -> Bool -> CmdMemoizer a b
CmdMemoizer (Int -> (a, b) -> IntMap (a, b) -> IntMap (a, b)
forall a. Int -> a -> IntMap a -> IntMap a
Map.insert Int
i (a
a,b
b) IntMap (a, b)
m) (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Bool
True
deleteResult :: CmdMemoizer a b -> CmdMemoizer a b
deleteResult :: forall a b. CmdMemoizer a b -> CmdMemoizer a b
deleteResult (CmdMemoizer IntMap (a, b)
m Int
i Bool
_) = IntMap (a, b) -> Int -> Bool -> CmdMemoizer a b
forall a b. IntMap (a, b) -> Int -> Bool -> CmdMemoizer a b
CmdMemoizer (Int -> IntMap (a, b) -> IntMap (a, b)
forall a. Int -> IntMap a -> IntMap a
Map.delete Int
i IntMap (a, b)
m) (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Bool
True
lookup :: Eq a => a -> CmdMemoizer a b -> Maybe b
lookup :: forall a b. Eq a => a -> CmdMemoizer a b -> Maybe b
lookup a
a (CmdMemoizer IntMap (a, b)
m Int
i Bool
modif) =
if Bool
modif then
Maybe b
forall a. Maybe a
Nothing
else
case Int -> IntMap (a, b) -> Maybe (a, b)
forall a. Int -> IntMap a -> Maybe a
Map.lookup Int
i IntMap (a, b)
m of
Maybe (a, b)
Nothing -> Maybe b
forall a. Maybe a
Nothing
Just (a
a', b
b) ->
if a
a a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
a' then
b -> Maybe b
forall a. a -> Maybe a
Just b
b
else
Maybe b
forall a. Maybe a
Nothing
nextCmd :: CmdMemoizer a b -> CmdMemoizer a b
nextCmd :: forall a b. CmdMemoizer a b -> CmdMemoizer a b
nextCmd CmdMemoizer a b
m = CmdMemoizer a b
m {currentIndex = currentIndex m + 1 }