module SequenceFormats.Genomic where import SequenceFormats.Bed (BedEntry(..), filterThroughBed) import SequenceFormats.Eigenstrat (EigenstratSnpEntry(..)) import SequenceFormats.FreqSum (FreqSumEntry(..)) import SequenceFormats.Pileup (PileupRow(..)) import SequenceFormats.Utils (Chrom) import SequenceFormats.VCF (VCFentry(..)) import Pipes (Producer) class Genomic a where genomicPosition :: a -> (Chrom, Int) genomicChrom :: a -> Chrom genomicChrom = fst . genomicPosition genomicBase :: a -> Int genomicBase = snd . genomicPosition instance Genomic EigenstratSnpEntry where genomicPosition (EigenstratSnpEntry c p _ _ _ _) = (c, p) instance Genomic FreqSumEntry where genomicPosition (FreqSumEntry c p _ _ _ _ _) = (c, p) instance Genomic PileupRow where genomicPosition (PileupRow c p _ _ _) = (c, p) instance Genomic VCFentry where genomicPosition (VCFentry c p _ _ _ _ _ _ _ _) = (c, p) chromFilter :: (Genomic e) => [Chrom] -> e -> Bool chromFilter exclusionList = (`notElem` exclusionList) . genomicChrom genomicFilterThroughBed :: (Monad m, Genomic e) => Producer BedEntry m () -> Producer e m () -> Producer e m () genomicFilterThroughBed bedProd = filterThroughBed bedProd genomicPosition