Skip to content

Latest commit

 

History

History
50 lines (36 loc) · 1.65 KB

README.org

File metadata and controls

50 lines (36 loc) · 1.65 KB

coruja

“Coruja” means “Owl” in Portuguese. It’s an alternative solution to the Observer pattern using signals&slots or a more classic approach using polymorphic types likes Subject and Observer. It’s a C++11 library with a more high level abstraction over the Observer pattern, avoiding bolierplate code and inversion of control IoC. STL containers like std::vector are adapted to become observables, i.e., observers may be notified when elements are inserted or erased. Actually a Range can be observable and observers may observe a transformation of a container, for example.

Observable containers

coruja::vector<string> v{"John Jones", "Robert Plant"};

v.for_each([](auto& member){ cout << member << endl; });

v.emplace_back("Jimmy Page");

//outputs:
//John Jones
//Robert Plant
//Jimmy Page

Observable ranges

struct person_t { std::string first_name, surname; };

vector<person_t> persons;

auto fullnames = transform
    (persons, [](auto& person){ return person.first_name + person.surname; });

fullnames.for_each([](auto&& fullname){ cout << fullname << endl; });

//outputs:
//JohnBonham
//JimmyPage

Observable objects

object<string> first_name, surname;

auto fullname = first_name + surname;
fullname.after_change([](auto&& s){ cout << s << endl; });

first_name = "Jimmy";
//outputs:
//Jimmy

surname = "Page";
//outputs:
//JimmyPage

This library is distributed under the Boost Software License, Version 1.0.