Принципы функционального программирования:
Пусть определен класс, с тремя функциями:
namespace Test;
class Lib
{
/**
* Sum a + b
*/
lambda int sum(int a, int b) => a + b;
/**
* Check object is istance
*/
lambda fn isInstance(string class_name) =>
bool (var item) use (class_name) => rtl::is_instanceof(item, class_name)
;
/**
* Equal two value by key
*/
lambda fn equal(var value)
=> bool (var item) use (value)
=> item == value
;
/**
* Equal two struct by key
*/
lambda fn equalNot(var value)
=> bool (var item) use (value)
=> item != value
;
}
Примеры
Collection names = ["1", "2", "3", "2"];
/* Оставим цифры, не равные 2 */
Collection names2 = names.filter( Lib::equalNot("2") );
/* Найдем цифру 3 в массиве */
int pos = names.find( Lib::equal("2") );
Найдем определенный класс в массиве
Collection classes =
[
new User{},
new Test{},
new Entity{},
new Route{},
];
/* Получим пользователя из массива */
User user = (User) classes.find( Lib::isInstance(classof User) );
/* Получим маршрут из массива */
Route route = (Route) classes.find( Lib::isInstance(classof Route) );
Pipe
User user = new User()
|> User::setName('John')
|> User::addEmail("john@example.com")
;
Или проще:
User user = new User()
-> setName('John')
-> addEmail("john@example.com")
;
В данном случае при вызове addEmail, первым аргументом передается измененный объект, а вторым строка "john@example.com". Pipe может быть асинхронным.