packages feed

sequence-formats-1.8.1.0: src/SequenceFormats/Genomic.hs

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