Skip to content

Instantly share code, notes, and snippets.

@jkelleyrtp
Created May 12, 2023 13:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jkelleyrtp/0c4b68dce3a1497e0b40fdc6680df19c to your computer and use it in GitHub Desktop.
Save jkelleyrtp/0c4b68dce3a1497e0b40fdc6680df19c to your computer and use it in GitHub Desktop.
Revamped selection API
struct GlobalState {
name: String,
age: i32,
user: User,
}
struct User {
name: String,
age: i32,
config: Config,
}
struct Config {
friends: Vec<String>,
}
struct ProjectedGlobalState {
age: Projected<i32>,
name: Projected<String>,
user: ProjectedUser,
}
struct ProjectedUser {
age: Projected<i32>,
name: Projected<String>,
config: ProjectedConfig,
}
struct ProjectedConfig {
friends: Projected<Vec<String>>,
}
struct Projected<T> {
_phantom: std::marker::PhantomData<T>,
}
impl<T> Clone for Projected<T> {
fn clone(&self) -> Self {
unimplemented!()
}
}
impl<T> Copy for Projected<T> {}
fn use_selector<T>(f: impl FnOnce(ProjectedGlobalState) -> Projected<T>) -> T {
todo!()
}
fn main() {
let age = use_selector(|state| state.user.config.friends);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment