@@ -15,15 +15,20 @@ import Control.Monad.Freer.Internal (handleRelayS)
1515import Control.Monad.Freer.Reader
1616import Control.Monad.Freer.State
1717import Control.Monad.Freer.Writer
18+import Data.Act
1819import Data.Fix
1920import Data.Foldable
2021import Data.Functor
2122import Data.Functor.Classes
23+import Data.Group
2224import Data.List.NonEmpty (NonEmpty (..))
2325import qualified Data.List.NonEmpty as NE
26+import Data.Map.Shifted.Strict (ShiftedMap (..))
27+import qualified Data.Map.Shifted.Strict as SM
2428import Data.Map.Strict (Map)
2529import qualified Data.Map.Strict as M
2630import Data.MonoTraversable
31+import Data.Monoid
2732import Data.Range (Range (..))
2833import qualified Data.Range as R
2934import Data.Sequence (Seq (..))
@@ -174,16 +179,22 @@ isClosed (x :-> y) = isClosed x && isClosed y
174179isClosed (List x) = isClosed x
175180isClosed (NAttrSet xs) = all isClosed . M.elems $ xs
176181
182+newtype DeBrujinContext = DeBrujinContext (Sum Int)
183+ deriving newtype (Eq, Ord, Show, Semigroup, Monoid, Group, Num)
184+
185+instance Act DeBrujinContext DeBrujin where
186+ act (DeBrujinContext (Sum n)) (DeBrujin i j) = DeBrujin (i + n) j
187+
177188close :: Range TypeVariable -> NType -> NType
178189close range =
179190 run
180− . evalState @(Map TypeVariable DeBrujin) M.empty
191+ . evalState @(ShiftedMap DeBrujinContext TypeVariable DeBrujin) mempty
181192 . runReader @Int 0
182193 . evalState @Int 0
183194 . close'
184195 where
185196 -- State is the sequential number, Reader is the binding context number
186− close' :: NType -> Eff '[State Int, Reader Int, State (Map TypeVariable DeBrujin)] NType
197+ close' :: NType -> Eff '[State Int, Reader Int, State (ShiftedMap DeBrujinContext TypeVariable DeBrujin)] NType
187198 close' x@(NAtomic _) = return x
188199 close' x@(NBrujin _) = return x
189200 close' (NTypeVariable tv) | tv `R.member` range = NBrujin <$> newbrujin tv
@@ -192,18 +203,18 @@ close range =
192203 close' (NAttrSet x) = bndCtx $ NAttrSet <$> traverse close' x
193204
194205 bndCtx m = do
195− modify @(Map TypeVariable DeBrujin) (fmap (\(DeBrujin i j) -> DeBrujin (i + 1) j))
206+ modify @(ShiftedMap DeBrujinContext TypeVariable DeBrujin) (SM.shift 1)
196207 x <- local @Int (+ 1) m
197− modify @(Map TypeVariable DeBrujin) (fmap (\(DeBrujin i j) -> DeBrujin (i - 1) j))
208+ modify @(ShiftedMap DeBrujinContext TypeVariable DeBrujin) (SM.shift (-1))
198209 return x
199210 newbrujin t = do
200− get @(Map TypeVariable DeBrujin) <&> M.lookup t >>= \case
211+ get @(ShiftedMap DeBrujinContext TypeVariable DeBrujin) <&> SM.lookup t >>= \case
201212 Nothing -> do
202213 i <- ask
203214 j <- get
204215 modify @Int (+ 1)
205216 let x = DeBrujin i j
206− modify @(Map TypeVariable DeBrujin) (M.insert t x)
217+ modify @(ShiftedMap DeBrujinContext TypeVariable DeBrujin) (SM.insert t x)
207218 return x
208219 Just x -> return x
209220