public Layer[] Compose(RegisteredTasks map, Identities filter)
{
var allTasks = GetAllTasks(map, filter);
var result = new List<Layer>();
while (allTasks.Any())
{
var layerTasks = allTasks.Where(task => AllDependenciesResolved(map, task.Id, result));
var layer = new Layer(layerTasks.Select(x => new ExecutableWithIdentity(x.Task, x.Id)).ToArray());
if (layer.IsEmpty)
{
throw new Exception(GetErrorMessage(allTasks, result));
}
result.Add(layer);
allTasks = allTasks.Where(item => !layer.Contains(item.Task)).ToList();
}
return result.ToArray();
}