(*
    Copyright David C. J. Matthews 2009

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
    
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
    
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*)

signature SIGNATURESSIG =
sig
    type sigs
    type structSigBind
    type parsetree
    type typeParsetree
    type typeVarForm
    type pretty
    type ptProperties
    type env
    type signatures
    type lexan
    type typeId
    type specs
    type location =
        { file: string, startLine: FixedInt.int, startPosition: FixedInt.int,
          endLine: FixedInt.int, endPosition: FixedInt.int }
    type exportTree = location * ptProperties list
    type navigation =
        {parent: (unit -> exportTree) option,
         next: (unit -> exportTree) option,
         previous: (unit -> exportTree) option}

    val mkStructureSig:     structSigBind list * location -> specs
    val mkStructureSigBinding: (string * location) * (sigs * bool * location) * location -> structSigBind
    val mkValSig:           (string * location) * typeParsetree * location -> specs
    val mkExSig:            (string * location) * typeParsetree option * location -> specs
    val mkCoreType:         parsetree * location -> specs
    val mkSharing:          bool * (string * location) list * location -> specs
    val mkWhereType:        sigs * typeVarForm list * string * typeParsetree * location -> sigs
    val mkInclude:          sigs list * location -> specs
    val mkSigIdent:         string * location -> sigs;
    val mkSig:              specs list * location -> sigs;

    val displaySigs: sigs * FixedInt.int -> pretty
    val sigExportTree: navigation * sigs -> exportTree 
    val sigVal: sigs * int * (int->typeId) * env * lexan * location -> signatures
    val undefinedSignature: signatures
    val isUndefinedSignature: signatures -> bool

    structure Sharing:
    sig
        type sigs           = sigs
        type structSigBind  = structSigBind
        type signatures     = signatures
        type parsetree      = parsetree
        type typeParsetree  = typeParsetree
        type typeVarForm    = typeVarForm
        type pretty         = pretty
        type ptProperties   = ptProperties
        type env            = env
        type lexan          = lexan
        type typeId         = typeId
        type specs          = specs
    end
end;
