/// class Region { public name : string; public constructor (name : string) { this.name = name; } public static RegionRoom = new RelationOneToMany(); public static RegionRegion = new RelationOneToMany(); public static InRelation = new RelationHandlerStrictOneToMany(Region.RegionRegion, Region.RegionRoom); public place (...rooms : Array) { rooms.forEach(room => { if (room instanceof Room) { Region.RegionRoom.setRelation(this, room); } else { Region.RegionRegion.setRelation(this, room); } }); } public getRooms () { let rooms = > Region.RegionRoom.getRight(this); Region.RegionRegion.getRight(this).forEach((region : Region) => { (> Region.RegionRoom.getRight(region)).forEach((room : Room) => { rooms.push(room); }); }); return rooms; } public containsRoom (room : Room) { let directlyContained = Region.RegionRoom.getLeft(room) == this; if (directlyContained) { return true; } else if (Region.RegionRegion.getLeft(this) != undefined) { return this.getRooms().indexOf(room) != -1; // If it's not directly contained, we have to check rooms for every region that contains this one and I don't care enough to do that right now // TODO: optimize this. } return false; } public contains (thing : Thing) { let room = thing.getRoom(); if (room == undefined) { return false; } else { let regions = Region.InRelation.getAllLeft(room); return regions.indexOf(this) != -1; } } }