1(* 2 Copyright (c) 2009, 2015-16 David C. J. Matthews 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License version 2.1 as published by the Free Software Foundation. 7 8 This library is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 Lesser General Public License for more details. 12 13 You should have received a copy of the GNU Lesser General Public 14 License along with this library; if not, write to the Free Software 15 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 16*) 17 18signature TYPEIDCODESIG = 19sig 20 type typeId 21 type codetree 22 type codeBinding 23 type types 24 type typeConstrs 25 type typeConstrSet 26 type typeVarForm 27 type typeVarMap 28 type level 29 30 val codeId: typeId * level -> codetree 31 val codeGenerativeId: 32 { source: typeId, isEq: bool, isDatatype: bool, mkAddr: int->int, level: level} -> codetree 33 34 val createDatatypeFunctions: 35 {typeConstr: typeConstrSet, eqStatus: bool, boxedCode: codetree, sizeCode: codetree } list * 36 (int->int) * level * typeVarMap * bool -> codeBinding list 37 38 val codeForUniqueId: unit->codetree 39 40 (* Generate a function of the form t*int->pretty for values of type t. *) 41 val printerForType: types * level * typeVarMap -> codetree 42 (* Generate a function of the form (t,t) -> bool. *) 43 val equalityForType: types * level * typeVarMap -> codetree 44 45 val applyToInstance: 46 { value: types, equality: bool, printity: bool} list * level * typeVarMap * (level -> codetree) -> codetree 47 48 structure TypeVarMap: 49 sig 50 (* Cache of type values and map of type variables. *) 51 type typeVarMap = typeVarMap 52 val defaultTypeVarMap: (int->int) * level -> typeVarMap (* The end of the chain. *) 53 (* Add a set of type variables to the map. *) 54 val extendTypeVarMap: (typeVarForm * (level->codetree)) list * (int->int) * level * typeVarMap -> typeVarMap 55 (* Look up a type variable and return the type it's mapped to. *) 56 val mapTypeVars: typeVarMap -> typeVarForm -> types option 57 (* Mark in the cache chain that some type constructors are new. *) 58 val markTypeConstructors: typeConstrs list * (int->int) * level * typeVarMap -> typeVarMap 59 (* Get the set of cached type values that have been created after this entry. *) 60 val getCachedTypeValues: typeVarMap -> codeBinding list 61 end 62 63 val defaultTypeCode: codetree 64 65 val justForEqualityTypes: bool 66 67 structure Sharing: 68 sig 69 type typeId = typeId 70 type codetree = codetree 71 type types = types 72 type typeConstrs= typeConstrs 73 type typeConstrSet=typeConstrSet 74 type typeVarForm=typeVarForm 75 type typeVarMap = typeVarMap 76 type codeBinding = codeBinding 77 type level = level 78 end 79end; 80