module SWCache(Cache, mkCache, cache, findC) where -- XXX make sure list gets trimmed import Graphics.UI.WX data Cache a b = C Int (Var [(a, b)]) mkCache :: Int -> IO (Cache a b) mkCache size = do vcache <- varCreate [] return (C size vcache) cache :: a -> b -> Cache a b -> IO () cache a b (C size vcache) = do l <- varGet vcache varSet vcache (take size ((a, b) : l)) findC :: (Eq a) => a -> Cache a b -> IO (Maybe b) findC a (C _ vcache) = do l <- varGet vcache let (r, l') = look a l [] varSet vcache l' return r -- Find a value and move entry to front if found. look a [] xs = (Nothing, reverse xs) look a (ab@(a',b):abs) xs = if a == a' then (Just b, ab : reverse xs ++ abs) else look a abs (ab:xs)