runMemoReaderT :: (MemoM m, Show s) => s -> MemoReaderT s m a -> m a
runMemoReaderT s r = 
  do x1 <- getMemo
     let l = Map.size (memoRead x1)
     setMemo x1 { memoRead = Map.insert l (show s) $ memoRead x1 }
     r <- deMemoReaderT s l r
     x2 <- getMemo
     setMemo x2 { memoRead = Map.delete l $ memoRead x2 }
     return r
runMemoReaderT :: (MemoM m, Show s) => s -> MemoReaderT s m a -> m a
runMemoReaderT s r = 
  do x1 <- getMemo
     let l = Map.size (memoRead x1)
     setMemo x1 { memoRead = Map.insert l (show s) $ memoRead x1 }
     r <- deMemoReaderT s l r
     x2 <- getMemo
     setMemo x2 { memoRead = Map.delete l $ memoRead x2 }
     return r
runMemoReaderT s r = 
  do x1 <- getMemo
     let l = Map.size (memoRead x1)
     setMemo x1 { memoRead = Map.insert l (show s) $ memoRead x1 }
     r <- deMemoReaderT s l r
     x2 <- getMemo
     setMemo x2 { memoRead = Map.delete l $ memoRead x2 }
     return r