{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Control.Monad.Foil.Blocks (
ExtWithin,
extWithinRanges,
extWithinRefl,
extWithinStep,
composeExtWithin,
Block,
beginBlock,
resumeBlock,
blockRange,
blockExt,
withFreshInBlock,
withExtendScopeRange,
ScopeUnion,
withDisjointUnion,
checkScopeUnion,
checkExtScope,
unionNameMaps,
) where
import Data.List (sortOn)
import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import Unsafe.Coerce (unsafeCoerce)
import Control.Monad.Foil.Internal
data ExtWithin (n :: S) (l :: S) = UnsafeExtWithin [NameRange]
extWithinRanges :: ExtWithin n l -> [NameRange]
extWithinRanges :: forall (n :: S) (l :: S). ExtWithin n l -> [NameRange]
extWithinRanges (UnsafeExtWithin [NameRange]
ranges) = [NameRange]
ranges
extWithinRefl :: NameRange -> ExtWithin n n
extWithinRefl :: forall (n :: S). NameRange -> ExtWithin n n
extWithinRefl NameRange
range = [NameRange] -> ExtWithin n n
forall (n :: S) (l :: S). [NameRange] -> ExtWithin n l
UnsafeExtWithin ([NameRange] -> [NameRange]
normaliseRanges [NameRange
range])
extWithinStep :: NameBinder l l' -> ExtWithin n l -> Maybe (ExtWithin n l')
extWithinStep :: forall (l :: S) (l' :: S) (n :: S).
NameBinder l l' -> ExtWithin n l -> Maybe (ExtWithin n l')
extWithinStep NameBinder l l'
binder (UnsafeExtWithin [NameRange]
ranges)
| (NameRange -> Bool) -> [NameRange] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\(NameRange RawName
lo RawName
hi) -> RawName
lo RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
x Bool -> Bool -> Bool
&& RawName
x RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
hi) [NameRange]
ranges = ExtWithin n l' -> Maybe (ExtWithin n l')
forall a. a -> Maybe a
Just ([NameRange] -> ExtWithin n l'
forall (n :: S) (l :: S). [NameRange] -> ExtWithin n l
UnsafeExtWithin [NameRange]
ranges)
| Bool
otherwise = Maybe (ExtWithin n l')
forall a. Maybe a
Nothing
where
x :: RawName
x = Name l' -> RawName
forall (l :: S). Name l -> RawName
nameId (NameBinder l l' -> Name l'
forall (n :: S) (l :: S). NameBinder n l -> Name l
nameOf NameBinder l l'
binder)
composeExtWithin :: ExtWithin n m -> ExtWithin m l -> ExtWithin n l
composeExtWithin :: forall (n :: S) (m :: S) (l :: S).
ExtWithin n m -> ExtWithin m l -> ExtWithin n l
composeExtWithin (UnsafeExtWithin [NameRange]
rs1) (UnsafeExtWithin [NameRange]
rs2) =
[NameRange] -> ExtWithin n l
forall (n :: S) (l :: S). [NameRange] -> ExtWithin n l
UnsafeExtWithin ([NameRange] -> [NameRange]
normaliseRanges ([NameRange]
rs1 [NameRange] -> [NameRange] -> [NameRange]
forall a. Semigroup a => a -> a -> a
<> [NameRange]
rs2))
normaliseRanges :: [NameRange] -> [NameRange]
normaliseRanges :: [NameRange] -> [NameRange]
normaliseRanges = [NameRange] -> [NameRange]
go ([NameRange] -> [NameRange])
-> ([NameRange] -> [NameRange]) -> [NameRange] -> [NameRange]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NameRange -> RawName) -> [NameRange] -> [NameRange]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn NameRange -> RawName
nameRangeLo ([NameRange] -> [NameRange])
-> ([NameRange] -> [NameRange]) -> [NameRange] -> [NameRange]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NameRange -> Bool) -> [NameRange] -> [NameRange]
forall a. (a -> Bool) -> [a] -> [a]
filter NameRange -> Bool
nonEmpty
where
nonEmpty :: NameRange -> Bool
nonEmpty (NameRange RawName
lo RawName
hi) = RawName
lo RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
hi
go :: [NameRange] -> [NameRange]
go (NameRange RawName
lo1 RawName
hi1 : r2 :: NameRange
r2@(NameRange RawName
lo2 RawName
hi2) : [NameRange]
rs)
| RawName
lo2 RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
hi1 = [NameRange] -> [NameRange]
go (RawName -> RawName -> NameRange
NameRange RawName
lo1 (RawName -> RawName -> RawName
forall a. Ord a => a -> a -> a
max RawName
hi1 RawName
hi2) NameRange -> [NameRange] -> [NameRange]
forall a. a -> [a] -> [a]
: [NameRange]
rs)
| RawName
hi1 RawName -> RawName -> Bool
forall a. Eq a => a -> a -> Bool
/= RawName
forall a. Bounded a => a
maxBound, RawName
lo2 RawName -> RawName -> Bool
forall a. Eq a => a -> a -> Bool
== RawName
hi1 RawName -> RawName -> RawName
forall a. Num a => a -> a -> a
+ RawName
1 = [NameRange] -> [NameRange]
go (RawName -> RawName -> NameRange
NameRange RawName
lo1 RawName
hi2 NameRange -> [NameRange] -> [NameRange]
forall a. a -> [a] -> [a]
: [NameRange]
rs)
| Bool
otherwise = RawName -> RawName -> NameRange
NameRange RawName
lo1 RawName
hi1 NameRange -> [NameRange] -> [NameRange]
forall a. a -> [a] -> [a]
: [NameRange] -> [NameRange]
go (NameRange
r2 NameRange -> [NameRange] -> [NameRange]
forall a. a -> [a] -> [a]
: [NameRange]
rs)
go [NameRange]
rs = [NameRange]
rs
rangeSetsOverlap :: [NameRange] -> [NameRange] -> Bool
rangeSetsOverlap :: [NameRange] -> [NameRange] -> Bool
rangeSetsOverlap (r1 :: NameRange
r1@(NameRange RawName
lo1 RawName
hi1) : [NameRange]
rs1) (r2 :: NameRange
r2@(NameRange RawName
lo2 RawName
hi2) : [NameRange]
rs2)
| RawName
hi1 RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
< RawName
lo2 = [NameRange] -> [NameRange] -> Bool
rangeSetsOverlap [NameRange]
rs1 (NameRange
r2 NameRange -> [NameRange] -> [NameRange]
forall a. a -> [a] -> [a]
: [NameRange]
rs2)
| RawName
hi2 RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
< RawName
lo1 = [NameRange] -> [NameRange] -> Bool
rangeSetsOverlap (NameRange
r1 NameRange -> [NameRange] -> [NameRange]
forall a. a -> [a] -> [a]
: [NameRange]
rs1) [NameRange]
rs2
| Bool
otherwise = Bool
True
rangeSetsOverlap [NameRange]
_ [NameRange]
_ = Bool
False
data Block (c :: S) (l :: S) = UnsafeBlock !NameRange (ExtWithin c l)
beginBlock :: NameRange -> Block c c
beginBlock :: forall (c :: S). NameRange -> Block c c
beginBlock NameRange
range = NameRange -> ExtWithin c c -> Block c c
forall (c :: S) (l :: S). NameRange -> ExtWithin c l -> Block c l
UnsafeBlock NameRange
range (NameRange -> ExtWithin c c
forall (n :: S). NameRange -> ExtWithin n n
extWithinRefl NameRange
range)
resumeBlock :: NameRange -> ExtWithin c l -> Maybe (Block c l)
resumeBlock :: forall (c :: S) (l :: S).
NameRange -> ExtWithin c l -> Maybe (Block c l)
resumeBlock range :: NameRange
range@(NameRange RawName
lo RawName
hi) ExtWithin c l
ext
| RawName
lo RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
> RawName
hi = Maybe (Block c l)
forall a. Maybe a
Nothing
| (NameRange -> Bool) -> [NameRange] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any NameRange -> Bool
covers (ExtWithin c l -> [NameRange]
forall (n :: S) (l :: S). ExtWithin n l -> [NameRange]
extWithinRanges ExtWithin c l
ext) = Block c l -> Maybe (Block c l)
forall a. a -> Maybe a
Just (NameRange -> ExtWithin c l -> Block c l
forall (c :: S) (l :: S). NameRange -> ExtWithin c l -> Block c l
UnsafeBlock NameRange
range ExtWithin c l
ext)
| Bool
otherwise = Maybe (Block c l)
forall a. Maybe a
Nothing
where
covers :: NameRange -> Bool
covers (NameRange RawName
lo' RawName
hi') = RawName
lo' RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
lo Bool -> Bool -> Bool
&& RawName
hi RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
hi'
blockRange :: Block c l -> NameRange
blockRange :: forall (c :: S) (l :: S). Block c l -> NameRange
blockRange (UnsafeBlock NameRange
range ExtWithin c l
_) = NameRange
range
blockExt :: Block c l -> ExtWithin c l
blockExt :: forall (c :: S) (l :: S). Block c l -> ExtWithin c l
blockExt (UnsafeBlock NameRange
_ ExtWithin c l
ext) = ExtWithin c l
ext
withFreshInBlock
:: Distinct l
=> Block c l
-> Scope l
-> (forall l'. DExt l l' => NameBinder l l' -> Block c l' -> r)
-> r
withFreshInBlock :: forall (l :: S) (c :: S) r.
Distinct l =>
Block c l
-> Scope l
-> (forall (l' :: S).
DExt l l' =>
NameBinder l l' -> Block c l' -> r)
-> r
withFreshInBlock (UnsafeBlock NameRange
range ExtWithin c l
ext) Scope l
scope forall (l' :: S). DExt l l' => NameBinder l l' -> Block c l' -> r
cont =
NameRange
-> Scope l
-> (forall (l :: S). DExt l l => NameBinder l l -> r)
-> r
forall (n :: S) r.
Distinct n =>
NameRange
-> Scope n
-> (forall (l :: S). DExt n l => NameBinder n l -> r)
-> r
withFreshIn NameRange
range Scope l
scope ((forall (l :: S). DExt l l => NameBinder l l -> r) -> r)
-> (forall (l :: S). DExt l l => NameBinder l l -> r) -> r
forall a b. (a -> b) -> a -> b
$ \NameBinder l l
binder ->
case NameBinder l l -> ExtWithin c l -> Maybe (ExtWithin c l)
forall (l :: S) (l' :: S) (n :: S).
NameBinder l l' -> ExtWithin n l -> Maybe (ExtWithin n l')
extWithinStep NameBinder l l
binder ExtWithin c l
ext of
Just ExtWithin c l
ext' -> NameBinder l l -> Block c l -> r
forall (l' :: S). DExt l l' => NameBinder l l' -> Block c l' -> r
cont NameBinder l l
binder (NameRange -> ExtWithin c l -> Block c l
forall (c :: S) (l :: S). NameRange -> ExtWithin c l -> Block c l
UnsafeBlock NameRange
range ExtWithin c l
ext')
Maybe (ExtWithin c l)
Nothing -> [Char] -> r
forall a. HasCallStack => [Char] -> a
error [Char]
"impossible: withFreshIn allocated outside its own range"
withExtendScopeRange
:: forall c r. Distinct c
=> Scope c
-> NameRange
-> Int
-> (forall n. DExt c n => Scope n -> NameBinderList c n -> ExtWithin c n -> r)
-> Maybe r
withExtendScopeRange :: forall (c :: S) r.
Distinct c =>
Scope c
-> NameRange
-> RawName
-> (forall (n :: S).
DExt c n =>
Scope n -> NameBinderList c n -> ExtWithin c n -> r)
-> Maybe r
withExtendScopeRange (UnsafeScope RawScope
scope) range :: NameRange
range@(NameRange RawName
lo RawName
hi) RawName
k forall (n :: S).
DExt c n =>
Scope n -> NameBinderList c n -> ExtWithin c n -> r
cont
| RawName
k RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
< RawName
0 = Maybe r
forall a. Maybe a
Nothing
| Bool
rangeOccupied = Maybe r
forall a. Maybe a
Nothing
| RawName -> Integer
forall a. Integral a => a -> Integer
toInteger RawName
k Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> Integer
rangeCapacity = Maybe r
forall a. Maybe a
Nothing
| Bool
otherwise =
r -> Maybe r
forall a. a -> Maybe a
Just (Scope (ZonkAny 2)
-> NameBinderList c (ZonkAny 2)
-> ExtWithin c (ZonkAny 2)
-> (DExt c (ZonkAny 2) =>
Scope (ZonkAny 2)
-> NameBinderList c (ZonkAny 2) -> ExtWithin c (ZonkAny 2) -> r)
-> r
forall (c :: S) (n :: S) r.
Scope n
-> NameBinderList c n
-> ExtWithin c n
-> (DExt c n =>
Scope n -> NameBinderList c n -> ExtWithin c n -> r)
-> r
unsafeExtendedWithin (RawScope -> Scope (ZonkAny 2)
forall (n :: S). RawScope -> Scope n
UnsafeScope RawScope
scope') NameBinderList c (ZonkAny 2)
forall (n :: S). NameBinderList c n
binders ([NameRange] -> ExtWithin c (ZonkAny 2)
forall (n :: S) (l :: S). [NameRange] -> ExtWithin n l
UnsafeExtWithin ([NameRange] -> [NameRange]
normaliseRanges [NameRange
range])) DExt c (ZonkAny 2) =>
Scope (ZonkAny 2)
-> NameBinderList c (ZonkAny 2) -> ExtWithin c (ZonkAny 2) -> r
Scope (ZonkAny 2)
-> NameBinderList c (ZonkAny 2) -> ExtWithin c (ZonkAny 2) -> r
forall (n :: S).
DExt c n =>
Scope n -> NameBinderList c n -> ExtWithin c n -> r
cont)
where
rangeOccupied :: Bool
rangeOccupied = case RawName -> RawScope -> Maybe RawName
IntSet.lookupGE RawName
lo RawScope
scope of
Just RawName
y -> RawName
y RawName -> RawName -> Bool
forall a. Ord a => a -> a -> Bool
<= RawName
hi
Maybe RawName
Nothing -> Bool
False
rangeCapacity :: Integer
rangeCapacity = Integer -> Integer -> Integer
forall a. Ord a => a -> a -> a
max Integer
0 (RawName -> Integer
forall a. Integral a => a -> Integer
toInteger RawName
hi Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- RawName -> Integer
forall a. Integral a => a -> Integer
toInteger RawName
lo Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1)
scope' :: RawScope
scope'
| RawName
k RawName -> RawName -> Bool
forall a. Eq a => a -> a -> Bool
== RawName
0 = RawScope
scope
| Bool
otherwise = RawScope -> RawScope -> RawScope
IntSet.union RawScope
scope ((RawName, RawName) -> RawScope
IntSet.fromRange (RawName
lo, RawName
lo RawName -> RawName -> RawName
forall a. Num a => a -> a -> a
+ (RawName
k RawName -> RawName -> RawName
forall a. Num a => a -> a -> a
- RawName
1)))
binders :: forall n. NameBinderList c n
binders :: forall (n :: S). NameBinderList c n
binders = [RawName] -> NameBinderList c n
forall (m :: S) (m' :: S). [RawName] -> NameBinderList m m'
go (if RawName
k RawName -> RawName -> Bool
forall a. Eq a => a -> a -> Bool
== RawName
0 then [] else [RawName
lo .. RawName
lo RawName -> RawName -> RawName
forall a. Num a => a -> a -> a
+ (RawName
k RawName -> RawName -> RawName
forall a. Num a => a -> a -> a
- RawName
1)])
where
go :: forall m m'. [RawName] -> NameBinderList m m'
go :: forall (m :: S) (m' :: S). [RawName] -> NameBinderList m m'
go [] = NameBinderList (ZonkAny 0) (ZonkAny 0) -> NameBinderList m m'
forall a b. a -> b
unsafeCoerce NameBinderList (ZonkAny 0) (ZonkAny 0)
forall (n :: S). NameBinderList n n
NameBinderListEmpty
go (RawName
x : [RawName]
xs) = NameBinder m (ZonkAny 1)
-> NameBinderList (ZonkAny 1) m' -> NameBinderList m m'
forall (n :: S) (i :: S) (l :: S).
NameBinder n i -> NameBinderList i l -> NameBinderList n l
NameBinderListCons (Name (ZonkAny 1) -> NameBinder m (ZonkAny 1)
forall (n :: S) (l :: S). Name l -> NameBinder n l
UnsafeNameBinder (RawName -> Name (ZonkAny 1)
forall (n :: S). RawName -> Name n
UnsafeName RawName
x)) ([RawName] -> NameBinderList (ZonkAny 1) m'
forall (m :: S) (m' :: S). [RawName] -> NameBinderList m m'
go [RawName]
xs)
unsafeExtendedWithin
:: forall c n r
. Scope n -> NameBinderList c n -> ExtWithin c n
-> (DExt c n => Scope n -> NameBinderList c n -> ExtWithin c n -> r)
-> r
unsafeExtendedWithin :: forall (c :: S) (n :: S) r.
Scope n
-> NameBinderList c n
-> ExtWithin c n
-> (DExt c n =>
Scope n -> NameBinderList c n -> ExtWithin c n -> r)
-> r
unsafeExtendedWithin Scope n
scope NameBinderList c n
binders ExtWithin c n
ext DExt c n => Scope n -> NameBinderList c n -> ExtWithin c n -> r
cont =
case forall (n :: S). DistinctEvidence n
unsafeDistinct @n of
DistinctEvidence n
Distinct -> case forall (n :: S) (l :: S). ExtEvidence n l
unsafeExt @c @n of
ExtEvidence c n
Ext -> DExt c n => Scope n -> NameBinderList c n -> ExtWithin c n -> r
Scope n -> NameBinderList c n -> ExtWithin c n -> r
cont Scope n
scope NameBinderList c n
binders ExtWithin c n
ext
withDisjointUnion
:: forall c n m r. (Distinct n, Distinct m)
=> ExtWithin c n
-> ExtWithin c m
-> Scope n
-> Scope m
-> (forall k. (Ext n k, Ext m k, Ext c k, Distinct k)
=> Scope k -> ScopeUnion n m k -> ExtWithin c k -> r)
-> Maybe r
withDisjointUnion :: forall (c :: S) (n :: S) (m :: S) r.
(Distinct n, Distinct m) =>
ExtWithin c n
-> ExtWithin c m
-> Scope n
-> Scope m
-> (forall (k :: S).
(Ext n k, Ext m k, Ext c k, Distinct k) =>
Scope k -> ScopeUnion n m k -> ExtWithin c k -> r)
-> Maybe r
withDisjointUnion (UnsafeExtWithin [NameRange]
rs1) (UnsafeExtWithin [NameRange]
rs2) (UnsafeScope RawScope
s1) (UnsafeScope RawScope
s2) forall (k :: S).
(Ext n k, Ext m k, Ext c k, Distinct k) =>
Scope k -> ScopeUnion n m k -> ExtWithin c k -> r
cont
| [NameRange] -> [NameRange] -> Bool
rangeSetsOverlap [NameRange]
rs1 [NameRange]
rs2 = Maybe r
forall a. Maybe a
Nothing
| Bool
otherwise = r -> Maybe r
forall a. a -> Maybe a
Just (Scope (ZonkAny 3) -> r
forall (k :: S). Scope k -> r
unsafeUnion (RawScope -> Scope (ZonkAny 3)
forall (n :: S). RawScope -> Scope n
UnsafeScope (RawScope -> RawScope -> RawScope
IntSet.union RawScope
s1 RawScope
s2)))
where
unsafeUnion :: forall k. Scope k -> r
unsafeUnion :: forall (k :: S). Scope k -> r
unsafeUnion Scope k
scope =
case forall (n :: S). DistinctEvidence n
unsafeDistinct @k of
DistinctEvidence k
Distinct -> case forall (n :: S) (l :: S). ExtEvidence n l
unsafeExt @n @k of
ExtEvidence n k
Ext -> case forall (n :: S) (l :: S). ExtEvidence n l
unsafeExt @m @k of
ExtEvidence m k
Ext -> case forall (n :: S) (l :: S). ExtEvidence n l
unsafeExt @c @k of
ExtEvidence c k
Ext -> Scope k -> ScopeUnion n m k -> ExtWithin c k -> r
forall (k :: S).
(Ext n k, Ext m k, Ext c k, Distinct k) =>
Scope k -> ScopeUnion n m k -> ExtWithin c k -> r
cont Scope k
scope ScopeUnion n m k
forall (n :: S) (m :: S) (k :: S). ScopeUnion n m k
UnsafeScopeUnion
([NameRange] -> ExtWithin c k
forall (n :: S) (l :: S). [NameRange] -> ExtWithin n l
UnsafeExtWithin ([NameRange] -> [NameRange]
normaliseRanges ([NameRange]
rs1 [NameRange] -> [NameRange] -> [NameRange]
forall a. Semigroup a => a -> a -> a
<> [NameRange]
rs2)))
data ScopeUnion (n :: S) (m :: S) (k :: S) = UnsafeScopeUnion
checkScopeUnion :: Scope n -> Scope m -> Scope k -> Maybe (ScopeUnion n m k)
checkScopeUnion :: forall (n :: S) (m :: S) (k :: S).
Scope n -> Scope m -> Scope k -> Maybe (ScopeUnion n m k)
checkScopeUnion (UnsafeScope RawScope
s1) (UnsafeScope RawScope
s2) (UnsafeScope RawScope
s3)
| RawScope -> RawScope -> RawScope
IntSet.union RawScope
s1 RawScope
s2 RawScope -> RawScope -> Bool
forall a. Eq a => a -> a -> Bool
== RawScope
s3 = ScopeUnion n m k -> Maybe (ScopeUnion n m k)
forall a. a -> Maybe a
Just ScopeUnion n m k
forall (n :: S) (m :: S) (k :: S). ScopeUnion n m k
UnsafeScopeUnion
| Bool
otherwise = Maybe (ScopeUnion n m k)
forall a. Maybe a
Nothing
checkExtScope :: Scope n -> Scope l -> Maybe (ExtEvidence n l)
checkExtScope :: forall (n :: S) (l :: S).
Scope n -> Scope l -> Maybe (ExtEvidence n l)
checkExtScope (UnsafeScope RawScope
s1) (UnsafeScope RawScope
s2)
| RawScope
s1 RawScope -> RawScope -> Bool
`IntSet.isSubsetOf` RawScope
s2 = ExtEvidence n l -> Maybe (ExtEvidence n l)
forall a. a -> Maybe a
Just ExtEvidence n l
forall (n :: S) (l :: S). ExtEvidence n l
unsafeExt
| Bool
otherwise = Maybe (ExtEvidence n l)
forall a. Maybe a
Nothing
unionNameMaps :: ScopeUnion n m k -> NameMap n a -> NameMap m a -> NameMap k a
unionNameMaps :: forall (n :: S) (m :: S) (k :: S) a.
ScopeUnion n m k -> NameMap n a -> NameMap m a -> NameMap k a
unionNameMaps ScopeUnion n m k
UnsafeScopeUnion (NameMap IntMap a
m1) (NameMap IntMap a
m2) = IntMap a -> NameMap k a
forall (n :: S) a. IntMap a -> NameMap n a
NameMap (IntMap a -> IntMap a -> IntMap a
forall a. IntMap a -> IntMap a -> IntMap a
IntMap.union IntMap a
m1 IntMap a
m2)