modelMemoReaderT (InEnv s a) = memoReaderT (\_ n -> deMemoReaderT s n (do { m1 <- getMemo
                                                                          ; let oldVal = memoRead m1 Map.! n
                                                                          ; setMemo m1 { memoRead = Map.insert n (show s) (memoRead m1) }
                                                                          ; x <- a
                                                                          ; m2 <- getMemo
                                                                          ; setMemo m2 { memoRead = Map.insert n oldVal (memoRead m2) }
                                                                          ; return x
                                                                          }
                                                                      )
                                           )
modelMemoReaderT (InEnv s a) = memoReaderT (\_ n -> deMemoReaderT s n (do { m1 <- getMemo
                                                                          ; let oldVal = memoRead m1 Map.! n
                                                                          ; setMemo m1 { memoRead = Map.insert n (show s) (memoRead m1) }
                                                                          ; x <- a
                                                                          ; m2 <- getMemo
                                                                          ; setMemo m2 { memoRead = Map.insert n oldVal (memoRead m2) }
                                                                          ; return x
                                                                          }
                                                                      )
                                           )
modelMemoReaderT (InEnv s a) = memoReaderT (\_ n -> deMemoReaderT s n (do { m1 <- getMemo
                                                                          ; let oldVal = memoRead m1 Map.! n
                                                                          ; setMemo m1 { memoRead = Map.insert n (show s) (memoRead m1) }
                                                                          ; x <- a
                                                                          ; m2 <- getMemo
                                                                          ; setMemo m2 { memoRead = Map.insert n oldVal (memoRead m2) }
                                                                          ; return x
                                                                          }
                                                                      )
                                           )