1 import Base 2 3 type CompiledBinding<-Compilation:Type,-Owner:Type> is Type: 4 CompiledBinding{-Held:Type,held:Held,same:{Held == Compilation & Owner : Type}} 5 6 def pack(-Compilation:Type,-Owner:Type,compilation:Compilation,owner:Owner) -> CompiledBinding: 7 CompiledBinding{Compilation & Owner,(compilation,owner),{==}} 8 def unpack(-Compilation:Type,-Owner:Type,binding:CompiledBinding) -> Compilation & Owner: 9 match binding: 10 case CompiledBinding{Held,held,same}: 11 %same : _ 12 held 13 def pack_pair(-Compilation:Type,-Owner:Type,pair:Compilation & Owner) -> CompiledBinding: 14 match pair: 15 case (compilation,owner):pack(Compilation,Owner,compilation,owner) 16 def owner_pair(-Compilation:Type,-Owner:Type,pair:Compilation & Owner) -> Owner: 17 match pair: 18 case (_,owner):owner 19 def owner(-Compilation:Type,-Owner:Type,binding:CompiledBinding) -> Owner: 20 owner_pair(Compilation,Owner,unpack(Compilation,Owner,binding)) 21 def owner_mapped(-Compilation:Type,-Owner:Type,-Out:Type,compilation:Compilation,result:Owner & Out) -> CompiledBinding & Out: 22 match result: 23 case (owner,out):(pack(Compilation,Owner,compilation,owner),out) 24 def owner_map_unpacked(-Compilation:Type,-Owner:Type,-Out:Type,observe:Owner -> Owner & Out,pair:Compilation & Owner) -> CompiledBinding & Out: 25 match pair: 26 case (compilation,owner):owner_mapped(Compilation,Owner,Out,compilation,observe(owner)) 27 def map_owner(-Compilation:Type,-Owner:Type,-Out:Type,observe:Owner -> Owner & Out,binding:CompiledBinding) -> CompiledBinding & Out: 28 owner_map_unpacked(Compilation,Owner,Out,observe,unpack(Compilation,Owner,binding))