grass_runtime/algorithm/
tag.rs1use crate::{
2 property::{
3 Named, Nuclide, Region, RegionCore, Scored, Serializable, Strand, Stranded, Tagged,
4 WithSequence,
5 },
6 record::ToSelfContained,
7};
8
9use super::Sorted;
10
11pub struct TaggedIter<I: Iterator + Sized, T: Clone> {
12 iter: I,
13 tag: T,
14}
15
16impl<I: Iterator, T: Clone + Default> Iterator for TaggedIter<I, T> {
17 type Item = TaggedItem<T, I::Item>;
18
19 fn next(&mut self) -> Option<Self::Item> {
20 self.iter.next().map(|value| TaggedItem {
21 tag: self.tag.clone(),
22 value,
23 })
24 }
25}
26
27impl<I: Iterator + Sorted, T: Clone + Default> Sorted for TaggedIter<I, T> {}
28
29pub trait TaggedIterExt: Iterator + Sorted + Sized {
30 fn tagged<T: Clone>(self, tag: T) -> TaggedIter<Self, T> {
31 TaggedIter { iter: self, tag }
32 }
33}
34
35impl<I: Iterator + Sorted + Sized> TaggedIterExt for I {}
36
37#[derive(Clone, Copy, Debug)]
38pub struct TaggedItem<T: Clone, V> {
39 tag: T,
40 value: V,
41}
42
43impl<T: Clone, V> Tagged<T> for TaggedItem<T, V> {
44 fn tag(&self) -> Option<T> {
45 Some(self.tag.clone())
46 }
47}
48
49impl<T: Clone, V: Region> RegionCore for TaggedItem<T, V> {
50 fn start(&self) -> u32 {
51 self.value.start()
52 }
53
54 fn end(&self) -> u32 {
55 self.value.end()
56 }
57
58 fn chrom(&self) -> crate::ChrRef<'static> {
59 self.value.chrom()
60 }
61}
62
63impl<'a, T: Clone, V: Named<'a>> Named<'a> for TaggedItem<T, V> {
64 fn name(&self) -> &str {
65 self.value.name()
66 }
67}
68
69impl<S, T: Clone, V: Scored<S>> Scored<S> for TaggedItem<T, V> {
70 fn score(&self) -> Option<S> {
71 self.value.score()
72 }
73}
74
75impl<T: Clone, V: WithSequence> WithSequence for TaggedItem<T, V> {
76 type RangeType = V::RangeType;
77
78 fn at(&self, offset: usize) -> Nuclide {
79 self.value.at(offset)
80 }
81
82 fn range(&self, from: usize, to: usize) -> Self::RangeType {
83 self.value.range(from, to)
84 }
85}
86
87impl<T: Clone, V: Stranded> Stranded for TaggedItem<T, V> {
88 fn strand(&self) -> Strand {
89 self.value.strand()
90 }
91}
92
93impl<T: Clone, V: Serializable> Serializable for TaggedItem<T, V> {
94 fn dump<W: std::io::Write>(&self, fp: W) -> std::io::Result<()> {
95 self.value.dump(fp)
96 }
97}
98
99impl<T: Clone + 'static, V: ToSelfContained> ToSelfContained for TaggedItem<T, V> {
100 type SelfContained = TaggedItem<T, V::SelfContained>;
101
102 fn to_self_contained(&self) -> Self::SelfContained {
103 TaggedItem {
104 tag: self.tag.clone(),
105 value: self.value.to_self_contained(),
106 }
107 }
108}