grass_runtime/algorithm/
tag.rs

1use 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}