use std::ops::Range;
use crate::model::Coord;
use crate::model::psl::{PslRecord, Strand};
use crate::ops::score::size_mul;
pub fn query_block_forward<P: PslRecord>(p: &P, i: usize) -> Range<Coord> {
let start = p.query_starts()[i];
let size = p.block_sizes()[i];
match p.strands().query {
Strand::Forward => start..start.saturating_add(size),
Strand::Reverse => {
let q = p.query_size();
q.saturating_sub(start.saturating_add(size))..q.saturating_sub(start)
}
}
}
pub fn reference_block_interval<P: PslRecord>(p: &P, i: usize) -> Range<Coord> {
let start = p.reference_starts()[i];
let size = p.block_sizes()[i].saturating_mul(size_mul(p) as Coord);
match p.strands().reference_or_forward() {
Strand::Forward => start..start.saturating_add(size),
Strand::Reverse => {
let r = p.reference_size();
r.saturating_sub(start.saturating_add(size))..r.saturating_sub(start)
}
}
}
pub fn intervals_overlap(a_start: Coord, a_end: Coord, b_start: Coord, b_end: Coord) -> bool {
a_start < b_end && b_start < a_end
}
pub fn overlaps_reference<P: PslRecord>(p: &P, name: &[u8], start: Coord, end: Coord) -> bool {
p.reference_name() == name
&& intervals_overlap(p.reference_start(), p.reference_end(), start, end)
}
pub fn overlaps_query<P: PslRecord>(p: &P, name: &[u8], start: Coord, end: Coord) -> bool {
p.query_name() == name && intervals_overlap(p.query_start(), p.query_end(), start, end)
}