package com.github.lindenb.jvarkit.util.bio.bin;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import htsjdk.samtools.SAMSequenceDictionary;
public class SamSequenceRecordBinMap<T>
{
private SAMSequenceDictionary dict=null;
private List<BinArray<T>> chroms;
public SamSequenceRecordBinMap(SAMSequenceDictionary dict)
{
this.dict=dict;
this.chroms=new ArrayList<BinArray<T>>(this.dict.size());
}
public SAMSequenceDictionary getSAMSequenceDictionary()
{
return dict;
}
protected BinArray<T> tree(int tid)
{
if(tid<0 || tid>=this.chroms.size()) return null;
return this.chroms.get(tid);
}
public Iterator<T> overlapping(String chrom,int start0,int end0)
{
return overlapping(
getSAMSequenceDictionary().getSequenceIndex(chrom),
start0,
end0
);
}
public Iterator<T> overlapping(int tid,int start0,int end0)
{
BinArray<T> tree=tree(tid);
if(tree==null) return new ArrayList<T>().iterator();
return tree.overlapping(start0, end0);
}
public List<T> getOverlapping(String chrom,int start0,int end0)
{
return getOverlapping(
getSAMSequenceDictionary().getSequenceIndex(chrom),
start0,
end0
);
}
public List<T> getOverlapping(int tid,int start0,int end0)
{
List<T> L=new ArrayList<T>();
for(Iterator<T> iter = overlapping(tid,start0, end0);
iter.hasNext();
)
{
L.add(iter.next());
}
return L;
}
public boolean containsOverlapping(String chrom,int start0,int end0)
{
return containsOverlapping(getSAMSequenceDictionary().getSequenceIndex(chrom),start0,end0);
}
public boolean containsOverlapping(int tid,int start0,int end0)
{
return overlapping(tid, start0, end0).hasNext();
}
/** inserts object o at chrom/start1/end1
* returns true if object was inserted
* */
public boolean put(String chrom,int start0,int end0,T o)
{
return put(getSAMSequenceDictionary().getSequenceIndex(chrom),start0,end0,o);
}
/** inserts object o at tid/start1/end1
* returns true if object was inserted
* */
public boolean put(int tid,int start0,int end0,T o)
{
if(tid<0) return false;
BinArray<T> m;
if(this.chroms.size()<=tid)
{
if(tid>=this.getSAMSequenceDictionary().size()) return false;
while(this.chroms.size()<tid) this.chroms.add(null);
m=new BinArray<T>();
this.chroms.add(m);
}
else
{
m= this.chroms.get(tid);
if(m==null)
{
m=new BinArray<T>();
this.chroms.set(tid, m);
}
}
m.put(start0, end0, o);
return true;
}
public boolean isEmpty()
{
return this.chroms.isEmpty();
}
}