package gl8080.physics.domain; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import gl8080.physics.domain.physical.TransactionalPhysical; public class World { private Set<TransactionalPhysical> physicals = new HashSet<>(); private Set<PhysicalLaw> physicalLaws = new HashSet<>(); void next(double sec) { this.physicals.forEach(physical -> { this.physicalLaws.forEach(law -> { law.apply(physical, sec); }); }); this.physicals.forEach(physical -> { physical.commit(); }); } public void addPhysical(Physical physical) { Objects.requireNonNull(physical); this.physicals.add(new TransactionalPhysical(physical)); } public void addPhysicalLaws(PhysicalLaw law) { Objects.requireNonNull(law); this.physicalLaws.add(law); } public Set<Physical> getPhysicalsWithout(Physical target) { return this.physicals .stream() .filter(p -> p != target) .collect(Collectors.toSet()); } }