module Bio.Location.SeqLocation ( SeqPos, displaySeqPos
                                , ContigSeqLoc, withinContigSeqLoc, displayContigSeqLoc 
                                , SeqLoc
                                , isWithin, overlaps, seqData
                                , display
                                )
    where 

import Control.Monad.Error
import qualified Data.ByteString.Lazy.Char8 as LBS
--import Data.List

import qualified Bio.Location.ContigLocation as CLoc
import qualified Bio.Location.Location as Loc
import Bio.Location.OnSeq
import qualified Bio.Location.Position as Pos
import Bio.Sequence.SeqData

type SeqPos = OnSeq Pos.Pos

displaySeqPos :: SeqPos -> String
displaySeqPos (OnSeq refname pos) = LBS.unpack refname ++ "@" ++ Pos.display pos

type ContigSeqLoc = OnSeq CLoc.ContigLoc

withinContigSeqLoc :: SeqPos -> ContigSeqLoc -> Bool
withinContigSeqLoc = andSameSeq CLoc.isWithin

displayContigSeqLoc :: ContigSeqLoc -> String
displayContigSeqLoc (OnSeq refname cloc) = LBS.unpack refname ++ "@" ++ CLoc.display cloc

type SeqLoc = OnSeq Loc.Loc

isWithin :: SeqPos -> SeqLoc -> Bool
isWithin = andSameSeq Loc.isWithin

overlaps :: SeqLoc -> SeqLoc -> Bool
overlaps = andSameSeq Loc.overlaps

seqData :: (Error e, MonadError e m) => (SeqName -> m SeqData) -> SeqLoc -> m SeqData
seqData = withSeqData Loc.seqData

display :: SeqLoc -> String
display (OnSeq refname loc) = LBS.unpack refname ++ "@" ++ Loc.display loc