module Bio.Location.SeqLocMap ( SeqLocMap , empty , fromList, insert , lookupWithin, lookupOverlaps ) where import Control.Arrow (first) import Data.List hiding (insert) import qualified Data.Map as M import Bio.Location.OnSeq import qualified Bio.Location.LocMap as LM import qualified Bio.Location.SeqLocation as SeqLoc type SeqLocMap a = OnSeqs (LM.LocMap a) empty :: SeqLocMap a empty = M.empty fromList :: [(SeqLoc.SeqLoc, a)] -> SeqLocMap a fromList = foldl' (\lm (sl,x) -> insert sl x lm) M.empty insert :: SeqLoc.SeqLoc -> a -> SeqLocMap a -> SeqLocMap a insert sloc x = perSeqUpdate (\loc locmap -> LM.insert loc x locmap) sloc lookupWithin :: SeqLoc.SeqPos -> SeqLocMap a -> [(SeqLoc.SeqLoc, a)] lookupWithin = withNameAndSeq namedLookupWithin where namedLookupWithin seqname pos = map (first $ OnSeq seqname) . LM.lookupWithin pos lookupOverlaps :: SeqLoc.SeqLoc -> SeqLocMap a -> [(SeqLoc.SeqLoc, a)] lookupOverlaps = withNameAndSeq namedLookupOverlaps where namedLookupOverlaps seqname loc = map (first $ OnSeq seqname) . LM.lookupOverlaps loc