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