Since there's not an accepted answer i throw a possible solution. Have you tried to makea design where the values are observables instead of the algorithm?
In c++ i would do something like this:
template <typename T>
struct observable
{
typedef function<void(const T&)> observer;
list<observer> observers;
T val;
void notify(const T& val)
{
for(auto&& o : observers)
o(val);
}
void operator=(const T& val)
{
this->val = val;
notify(this->val);
}
void watch(const observer& obs)
{
observers.push_back(obs);
}
};
And then in my algo:
struct myalgo
{
observable<info> _info;
void do_work(params)
{
info myinfo;
do { job(); info.x = "info1" info.y = "info2"; _info = myinfo; }
while (!has_to_stop());
}