Comments (7)
If you wanted to try to help hack on it, I think maybe the best way to solve it is to refactor the current mark_observed and mark_unobserved functions into a kind of Observer object
I'll try to play around with this idea. Would be a nice learning experience for myself as well :)
from anchors.
I think you can actually do this already without any changes to Anchors, although perhaps it can be made more ergonomic? Just added this as example/update_callback.rs
:
use anchors::expert::{AnchorExt, Var};
use anchors::singlethread::*;
use std::cell::RefCell;
fn main() {
let mut engine = Engine::new();
let (cat_count, set_cat_count) = Var::new(1);
let (dog_count, set_dog_count) = Var::new(1);
let (fish_count, set_fish_count) = Var::new(1);
let total_mammals = (&cat_count, &dog_count).map(|cats, dogs| cats + dogs);
let total_animals = (&total_mammals, &fish_count).map(|mammals, fish| mammals + fish);
let mammal_callback = total_mammals.map(|total_mammals| println!("mammals updated: {:?}", total_mammals));
let animal_callback = total_animals.map(|total_animals| println!("animals updated: {:?}", total_animals));
engine.mark_observed(&mammal_callback);
engine.mark_observed(&animal_callback);
println!("stabilizing...");
engine.stabilize();
set_cat_count.set(2);
set_dog_count.set(2);
println!("stabilizing...");
engine.stabilize();
set_fish_count.set(2);
println!("stabilizing...");
engine.stabilize();
}
from anchors.
Hey, sorry, just saw this! Would definitely be a great feature to add, thanks for the suggestion! I'll try to get to it in a couple days.
from anchors.
It's all good! I was interested in helping out too, but I don't know if i understand the architecture well enough :)
Thank you a lot!
from anchors.
If you wanted to try to help hack on it, I think maybe the best way to solve it is to refactor the current mark_observed and mark_unobserved functions into a kind of Observer object, and maybe allow subscribing to changes on that object? Kind of a vague suggestion, sorry.
Glad somebody out there is actually using this library, and sorry for the poor documentation!
from anchors.
Ah, I see, of course using map would be a way to accomplish this.
What I had played around with was adding a callback function to the var new
method and called it new_observed
having that take in a callback closure which was added onto the returned Var
. I'd then call down to that callback in poll_updated
. Although it does work, it required a lot of finicky type declarations to make the compiler happy, not really a solution I liked.
This is more sensible :)
from anchors.
Ah, nice! Glad this works for you, and thanks again for submitting this feedback.
Will close this issue, but if you have other ideas for improvements, would love to hear them! Feel free to open as many issues as you'd like.
from anchors.
Related Issues (20)
- multithreading engine HOT 1
- if maps aren't `cutoff`, then we need to clone during partial_eq cutoff HOT 1
- fakeheap can allow multiple inserts of the same node. need to write tests to make sure nodes will only be computed at higher height ever inserted
- mark_unobserved doesn't switch necessary children to clean HOT 2
- Can skip dirty marking parents that are already dirty?
- If, in a `then`, one node is pending and another is updated, the second will be unchanged the next time we check. all our anchors should keep track of if a value has updated
- changing height of queued node should requeue at correct height
- this should fail to compile HOT 1
- notnull instead of *const Node
- composite nodes?
- in-node cutoffs
- upqueries
- how to make global static like singlethread::Engine? HOT 1
- combine var and varsetter into single struct, call watch to get anchor
- collections module
- more speedup ideas to test
- Engine::get_stale
- thread 'main' has overflowed its stack HOT 2
- What would be the right way of using a scan operator? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from anchors.