@@ -681,8 +681,11 @@ ppTermInMonCtx :: MonadifyCtx -> Term -> String
681
681
ppTermInMonCtx ctx t =
682
682
scPrettyTermInCtx defaultPPOpts (map (\ (x,_,_) -> x) ctx) t
683
683
684
- -- | A memoization table for monadifying terms
685
- type MonadifyMemoTable = IntMap MonTerm
684
+ -- | A memoization table for monadifying terms: a map from 'TermIndex'es to
685
+ -- 'MonTerm's and, possibly, corresponding 'ArgMonTerm's. The latter are simply
686
+ -- the result of calling 'argifyMonTerm' on the former, but are only added when
687
+ -- needed (i.e. when 'memoArgMonTerm' is called, e.g. in 'monadifyArg').
688
+ type MonadifyMemoTable = IntMap (MonTerm , Maybe ArgMonTerm )
686
689
687
690
-- | The empty memoization table
688
691
emptyMemoTable :: MonadifyMemoTable
@@ -752,15 +755,34 @@ runCompleteMonadifyM sc env top_ret_tp m =
752
755
runMonadifyM env [] (toArgType $ monadifyType [] top_ret_tp) m
753
756
754
757
-- | Memoize a computation of the monadified term associated with a 'TermIndex'
755
- memoizingM :: TermIndex -> MonadifyM MonTerm -> MonadifyM MonTerm
756
- memoizingM i m =
758
+ memoMonTerm :: TermIndex -> MonadifyM MonTerm -> MonadifyM MonTerm
759
+ memoMonTerm i m =
757
760
(IntMap. lookup i <$> get) >>= \ case
758
- Just ret ->
759
- return ret
761
+ Just (mtm, _) ->
762
+ return mtm
760
763
Nothing ->
761
- do ret <- m
762
- modify (IntMap. insert i ret)
763
- return ret
764
+ do mtm <- m
765
+ modify (IntMap. insert i (mtm, Nothing ))
766
+ return mtm
767
+
768
+ -- | Memoize a computation of the monadified term of argument type associated
769
+ -- with a 'TermIndex', using a memoized 'ArgTerm' directly if it exists or
770
+ -- applying 'argifyMonTerm' to a memoized 'MonTerm' (and memoizing the result)
771
+ -- if it exists
772
+ memoArgMonTerm :: TermIndex -> MonadifyM MonTerm -> MonadifyM ArgMonTerm
773
+ memoArgMonTerm i m =
774
+ (IntMap. lookup i <$> get) >>= \ case
775
+ Just (_, Just argmtm) ->
776
+ return argmtm
777
+ Just (mtm, Nothing ) ->
778
+ do argmtm <- argifyMonTerm mtm
779
+ modify (IntMap. insert i (mtm, Just argmtm))
780
+ return argmtm
781
+ Nothing ->
782
+ do mtm <- m
783
+ argmtm <- argifyMonTerm mtm
784
+ modify (IntMap. insert i (mtm, Just argmtm))
785
+ return argmtm
764
786
765
787
-- | Turn a 'MonTerm' of type @CompMT(tp)@ to a term of argument type @MT(tp)@
766
788
-- by inserting a monadic bind if the 'MonTerm' is computational
@@ -799,7 +821,15 @@ monadifyTypeM tp =
799
821
800
822
-- | Monadify a term to a monadified term of argument type
801
823
monadifyArg :: Maybe MonType -> Term -> MonadifyM ArgMonTerm
802
- monadifyArg mtp t = monadifyTerm mtp t >>= argifyMonTerm
824
+ {-
825
+ monadifyArg _ t
826
+ | trace ("Monadifying term of argument type: " ++ showTerm t) False
827
+ = undefined
828
+ -}
829
+ monadifyArg mtp t@ (STApp { stAppIndex = ix }) =
830
+ memoArgMonTerm ix $ monadifyTerm' mtp t
831
+ monadifyArg mtp t =
832
+ monadifyTerm' mtp t >>= argifyMonTerm
803
833
804
834
-- | Monadify a term to argument type and convert back to a term
805
835
monadifyArgTerm :: Maybe MonType -> Term -> MonadifyM OpenTerm
@@ -813,7 +843,7 @@ monadifyTerm _ t
813
843
= undefined
814
844
-}
815
845
monadifyTerm mtp t@ (STApp { stAppIndex = ix }) =
816
- memoizingM ix $ monadifyTerm' mtp t
846
+ memoMonTerm ix $ monadifyTerm' mtp t
817
847
monadifyTerm mtp t =
818
848
monadifyTerm' mtp t
819
849
0 commit comments