<> <> DIRECTORY HashPairCollectionsPrivate, HashTables, Collections, PairCollections; HashPairCollectionsPublicImpl: CEDAR PROGRAM IMPORTS HashPairCollectionsPrivate, HashTables, Collections, PairCollections EXPORTS PairCollections = BEGIN OPEN HT:HashTables, Colls:Collections, Collections, PairCollections, HashPairCollectionsPrivate; CreateHashReln: PUBLIC PROC [spaces: SpacePair _ [NIL, NIL], functional: BoolPair _ [FALSE, FALSE], mappable: BoolPair _ [TRUE, TRUE]] RETURNS [VarPairColl] ~ { ability: Abilities; FOR dir: Direction IN Direction DO IF spaces[Source[dir]]=NIL THEN spaces[Source[dir]] _ Colls.refs; ability[dir] _ IF functional[dir] THEN map ELSE IF mappable[dir] THEN image ELSE none; ENDLOOP; {bestDir: Direction ~ IF ability[rightToLeft] > ability[leftToRight] THEN rightToLeft ELSE leftToRight; hr: HashRelation ~ NEW [HashRelationPrivate _ [ spaces: spaces, ability: ability, bestDir: bestDir, bestAbility: ability[bestDir], tables: [HT.Create[spaces[left]], HT.Create[spaces[right]]] ]]; RETURN [AsVar[[FetchClass[hr.ability, variable], hr]]]; }}; CreateHashCopy: PUBLIC PROC [pc: PairColl, spaces: SpacePair _ [NIL, NIL], mappable: BoolPair _ [FALSE, FALSE]] RETURNS [copy: HashFn] ~ { FOR side: Side IN Side DO IF spaces[side]=NIL THEN spaces[side] _ pc.Spaces[][side]; IF pc.QualityOf[$Image, LIST[IF side=left THEN $leftToRight ELSE $rightToLeft]] >= goodDefault THEN mappable[From[side]] _ TRUE; ENDLOOP; copy _ CreateHashReln[spaces, pc.Functional, mappable]; [] _ copy.AddColl[pc]; }; END.