yazi_core/manager/
linked.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use std::{collections::HashMap, ops::{Deref, DerefMut}};

use yazi_shared::url::Url;

#[derive(Default)]
pub struct Linked(HashMap<Url, Url> /* from ==> to */);

impl Deref for Linked {
	type Target = HashMap<Url, Url>;

	fn deref(&self) -> &Self::Target { &self.0 }
}

impl DerefMut for Linked {
	fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
}

impl Linked {
	pub fn from_dir<'a, 'b>(&'a self, url: &'b Url) -> Box<dyn Iterator<Item = &'a Url> + 'b>
	where
		'a: 'b,
	{
		if let Some(to) = self.get(url) {
			Box::new(self.iter().filter(move |(k, v)| *v == to && *k != url).map(|(k, _)| k))
		} else {
			Box::new(self.iter().filter(move |(_, v)| *v == url).map(|(k, _)| k))
		}
	}

	pub fn from_file(&self, url: &Url) -> Vec<Url> {
		if self.is_empty() {
			return vec![];
		}

		let Some(p) = url.parent_url() else {
			return vec![];
		};

		let name = url.file_name().unwrap();
		self.from_dir(&p).map(|u| u.join(name)).collect()
	}
}