use crate::data::{
ByteValidator,
alphas::*,
array_types::make_lowercase,
mappings::{ByteIndexMap, ByteMap},
};
pub(crate) const IS_DNA_IUPAC_NO_GAPS: ByteValidator = ByteValidator::none().add(DNA_IUPAC);
pub(crate) const IS_DNA_IUPAC_NO_GAPS_UC: ByteValidator = ByteValidator::none().add(DNA_IUPAC_UC);
pub(crate) const IS_DNA_IUPAC_WITH_GAPS: ByteValidator = IS_DNA_IUPAC_NO_GAPS.add(b"-.");
pub(crate) const IS_DNA_IUPAC_WITH_GAPS_UC: ByteValidator = IS_DNA_IUPAC_NO_GAPS_UC.add(b"-.");
pub(crate) const IS_DNA_ACGTN_NO_GAPS: ByteValidator = ByteValidator::none().add(DNA_ACGTN);
pub(crate) const IS_DNA_ACGTN_NO_GAPS_UC: ByteValidator = ByteValidator::none().add(DNA_ACGTN_UC);
pub(crate) const IS_DNA_ACGTN_STD_GAPS_UC: ByteValidator = IS_DNA_ACGTN_NO_GAPS_UC.add(b"-");
pub(crate) const IS_DNA_ACGT_NO_GAPS: ByteValidator = ByteValidator::none().add(b"acgtACGT");
pub(crate) const IS_DNA_ACGT_NO_GAPS_UC: ByteValidator = ByteValidator::none().add(b"ACGT");
pub const RETAIN_DNA_IUPAC_NO_GAPS_UC: ByteMap = ByteMap::all(0)
.preserve(DNA_IUPAC_UC)
.map(&make_lowercase(DNA_IUPAC_UC), DNA_IUPAC_UC)
.map(b"Uu", b"TT");
pub const RETAIN_DNA_IUPAC_WITH_GAPS_UC: ByteMap = RETAIN_DNA_IUPAC_NO_GAPS_UC.preserve(b".-");
pub const RETAIN_DNA_ACGTN_NO_GAPS_UC: ByteMap = ByteMap::all(0)
.preserve(DNA_ACGTN_UC)
.map(&make_lowercase(DNA_ACGTN_UC), DNA_ACGTN_UC)
.map(b"Uu", b"TT");
pub const RETAIN_DNA_ACGTN_WITH_GAPS_UC: ByteMap = RETAIN_DNA_ACGTN_NO_GAPS_UC.preserve(b".-");
pub(crate) const RETAIN_DNA_IUPAC_CORRECT_GAPS_UC: ByteMap = RETAIN_DNA_IUPAC_WITH_GAPS_UC.map_to_one(b":~", b'-');
pub(crate) const RETAIN_DNA_ACGT_NO_GAPS_UC: ByteMap = RETAIN_DNA_ACGTN_NO_GAPS_UC.map_to_one(b"Nn", 0);
pub(crate) const RETAIN_DNA_ACGTN_STD_GAPS_UC: ByteMap = RETAIN_DNA_ACGTN_WITH_GAPS_UC.map_to_one(b".-:~", b'-');
pub(crate) const IUPAC_TO_DNA_ACGTN_UC: ByteMap = ByteMap::identity()
.map(&make_lowercase(DNA_IUPAC_UC), DNA_IUPAC_UC)
.map(b"Uu", b"TT")
.map_to_one(b"RYSWKMBDHVN", b'N')
.map_to_one(b"ryswkmbdhvn", b'N');
pub(crate) const IUPAC_TO_DNA_ACGTN: ByteMap = ByteMap::identity()
.map(b"Uu", b"Tt")
.map_to_one(b"RYSWKMBDHVN", b'N')
.map_to_one(b"ryswkmbdhvn", b'n');
#[rustfmt::skip]
pub(crate) const TO_COMPLEMENT: ByteMap = ByteMap::identity()
.map(
b"GCATRYKMBVDHU",
b"CGTAYRMKVBHDA"
).map(
b"gcatrykmbvdhu",
b"cgtayrmkvbhda"
);
pub const RECODE_TO_DNA_ACGTN_NO_GAPS_UC: ByteMap = ByteMap::all(b'N')
.preserve(DNA_ACGTN_UC)
.map(&make_lowercase(DNA_ACGTN_UC), DNA_ACGTN_UC)
.map(b"Uu", b"TT");
pub const RECODE_TO_DNA_ACGTN_WITH_GAPS_UC: ByteMap = RECODE_TO_DNA_ACGTN_NO_GAPS_UC.preserve(b".-");
pub const RECODE_TO_DNA_ACGTN_NO_GAPS: ByteMap = ByteMap::all(b'N')
.preserve(DNA_ACGTN_UC)
.preserve(&make_lowercase(DNA_ACGTN_UC))
.map(b"Uu", b"Tt");
pub const RECODE_TO_DNA_ACGTN_WITH_GAPS: ByteMap = RECODE_TO_DNA_ACGTN_NO_GAPS.preserve(b".-");
pub const RECODE_TO_DNA_IUPAC_NO_GAPS_UC: ByteMap = ByteMap::all(b'N')
.preserve(DNA_IUPAC_UC)
.map(&make_lowercase(DNA_IUPAC_UC), DNA_IUPAC_UC)
.map(b"Uu", b"TT");
pub const RECODE_TO_DNA_IUPAC_WITH_GAPS_UC: ByteMap = RECODE_TO_DNA_IUPAC_NO_GAPS_UC.preserve(b".-");
pub const RECODE_TO_DNA_IUPAC_NO_GAPS: ByteMap = ByteMap::all(b'N')
.preserve(DNA_IUPAC_UC)
.preserve(&make_lowercase(DNA_IUPAC_UC))
.map(b"Uu", b"Tt");
pub const RECODE_TO_DNA_IUPAC_WITH_GAPS: ByteMap = RECODE_TO_DNA_IUPAC_NO_GAPS.preserve(b".-");
pub(crate) const TO_RNA: ByteMap = ByteMap::all(b'N').preserve(b"ACGUNacgun").map(b"Tt", b"Uu");
pub(crate) const TO_RNA_UC: ByteMap = ByteMap::all(b'N').map(b"ACGUT", b"ACGUU").map(b"acgut", b"ACGUU");
pub(crate) const RECODE_TO_DNA_IUPAC_CORRECT_GAPS_UC: ByteMap = RECODE_TO_DNA_IUPAC_WITH_GAPS_UC.map(b":~", b"--");
pub const DNA_PROFILE_MAP: ByteIndexMap<5> =
ByteIndexMap::new_ignoring_case(*b"ACGTN", b'N').add_synonym_ignore_case(b'U', b'T');
pub const DNA_UNAMBIG_PROFILE_MAP: ByteIndexMap<4> =
ByteIndexMap::new_ignoring_case(*b"ACGT", b'A').add_synonym_ignore_case(b'U', b'T');
pub(crate) const THREE_BIT_MAPPING: ByteMap = ByteMap::all(3)
.map(b"ACG", &[4, 5, 6])
.map(b"acg", &[4, 5, 6])
.map_to_one(b"TUtu", 7);
pub(crate) const TWO_BIT_MAPPING: ByteMap = ByteMap::all(0).map(b"CG", &[1, 2]).map(b"cg", &[1, 2]).map_to_one(b"TUtu", 3);
pub(crate) const DNA_COUNT_PROFILE_MAP: ByteMap = ByteMap::all(7)
.map_to_one(DNA_IUPAC, 6)
.map(b".", &[6])
.map(b"-", &[5])
.map(b"ACGTUN", &[0, 1, 2, 3, 3, 4])
.map(b"acgtun", &[0, 1, 2, 3, 3, 4]);