package org.softlang.company;
import rx.Observable;
import rx.util.functions.Action1;
import rx.util.functions.Func1;
import java.util.ArrayList;
import java.util.List;
public class Department {
private final String name;
private Employee manager;
private final List<Employee> employees;
private final List<Department> subDepts;
public Department(String name, Employee manager) {
this.name = name;
this.manager = manager;
this.employees = new ArrayList<>();
this.subDepts = new ArrayList<>();
}
public String getName() {
return name;
}
public void addEmployee(Employee employee) {
employees.add(employee);
}
public void addDepartment(Department dept) {
subDepts.add(dept);
}
public Observable<Double> total() {
Observable<Double> employeeResult = Observable.from(employees).sumDouble(new Func1<Employee, Double>() {
@Override
public Double call(Employee employee) {
return employee.getSalary();
}
});
Observable<Double> departmentResult = Observable.sumDouble(
Observable.from(subDepts).flatMap(new Func1<Department, Observable<? extends Double>>() {
@Override
public Observable<? extends Double> call(Department department) {
return department.total();
}
}));
return Observable.merge(employeeResult, departmentResult, Observable.from(manager.getSalary()));
}
public void cut() {
Observable.from(employees).subscribe(new Action1<Employee>() {
@Override
public void call(Employee employee) {
employee.setSalary(employee.getSalary() * 0.5);
}
});
Observable.from(subDepts).subscribe(new Action1<Department>() {
@Override
public void call(Department department) {
department.cut();
}
});
Observable.from(manager).subscribe(new Action1<Employee>() {
@Override
public void call(Employee employee) {
employee.setSalary(employee.getSalary() * 0.5);
}
});
}
}