import(methods)
importFrom(utils, .DollarNames, capture.output)
importFrom(stats, setNames)
importFrom(stats4, summary, update)

import(BiocGenerics)
import(S4Vectors)
import(IRanges)
import(Seqinfo)


### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### Export S4 classes
###

exportClasses(
    Constraint, Constraint_OR_NULL,
    GenomicRanges, GenomicRanges_OR_missing, GenomicPos,
    IRanges_OR_IPos, GRanges, GPos, UnstitchedGPos, StitchedGPos,
    GRangesFactor,
    DelegatingGenomicRanges,
    GNCList,
    GenomicRangesList, GenomicRanges_OR_GenomicRangesList,
    SimpleGenomicRangesList, CompressedGenomicRangesList,
    GRangesList, SimpleGRangesList, CompressedGRangesList,
    GenomicRanges_OR_GRangesList
)


### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### Export S3 methods
###

S3method(.DollarNames, GenomicRanges)
S3method(.DollarNames, GRanges)

S3method(as.data.frame, GPos)

S3method(duplicated, GenomicRanges)

S3method(sort, GenomicRanges)
S3method(sort, GRangesList)

S3method(summary, GenomicRanges)
S3method(summary, GPos)

### We also export them thru the export() directive so that (a) they can be
### called directly, (b) tab-completion on the name of the generic shows them,
### and (c) methods() doesn't asterisk them.
export(
    as.data.frame.GPos,

    duplicated.GenomicRanges,

    sort.GenomicRanges,
    sort.GRangesList,

    summary.GenomicRanges,
    summary.GPos
)


### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### Export S4 methods for generics not defined in GenomicRanges
###

exportMethods(
    length,
    names, "names<-",
    "[", "[<-", "$", "$<-",
    as.character, as.factor, as.data.frame,
    coerce,
    show,
    split, unlist,
    range,
    Ops,
    merge,

    ## Generics defined in the stats4 package:
    summary, update,

    ## Generics defined in the BiocGenerics package:
    duplicated, match,
    is.unsorted, order, sort, rank,
    union, intersect, setdiff,
    start, "start<-", end, "end<-", width, "width<-",
    strand, "strand<-", invertStrand,
    score, "score<-",
    updateObject,

    ## Generics defined in S4Vectors:
    bindROWS,
    parallel_slot_names,
    elementMetadata, "elementMetadata<-",
    mcols, "mcols<-",
    values, "values<-",
    pcompare,
    selfmatch,
    FactorToClass,
    relistToClass,

    ## Generics defined in IRanges:
    ranges, "ranges<-",
    rglist,
    pos,
    findOverlaps, countOverlaps,
    windows, narrow,
    update_ranges,
    shift, resize, flank, promoters, terminators, restrict, trim,
    reduce, gaps, disjoin, isDisjoint, disjointBins,
    coverage,
    punion, pintersect, psetdiff, pgap,
    precede, follow, nearest, distance, distanceToNearest, nearestKNeighbors,
    tile, slidingWindows,

    ## Generics defined in Seqinfo:
    seqinfo, "seqinfo<-",
    seqnames, "seqnames<-"
)


### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### Export non-generic functions
###

export(
    phicoef,

    GRanges, .DollarNames.GenomicRanges, .DollarNames.GRanges,
    GPos, from_GPos_to_GRanges,
    GRangesFactor,
    GNCList,
    GRangesList,

    makeGRangesFromDataFrame,
    makeGPosFromDataFrame,
    makeGRangesListFromDataFrame,
    makeGRangesListFromFeatureFragments,

    isSmallGenome, absoluteRanges, relativeRanges,
    tileGenome,
    bindAsGRanges, mcolAsRleList, binnedAverage
)


### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
### Export S4 generics defined in GenomicRanges + export corresponding
### methods
###

export(
    ## constraint.R:
    #constraint, "constraint<-",
    checkConstraint,

    ## genomic-range-squeezers.R:
    granges, grglist,

    ## subtract-methods.R:
    subtract
)

### Exactly the same list as above.
exportMethods(
    #constraint, "constraint<-",
    checkConstraint,
    granges, grglist,
    subtract
)

