#lang sml (* * (c) Andreas Rossberg 1999-2007 * * Helpers for handling source strings *) structure Source :> SOURCE = struct type source = string type pos = {abs : int, lin : int, col : int} type region = {left : pos, right : pos} type info = {file : string option, region : region} exception Error of (int * int) * string val nowherePos = {abs = 0, lin = 0, col = 0} val nowhere = {file = NONE, region = {left = nowherePos, right = nowherePos}} fun over'(r1 : region, r2 : region) = {left = #left r1, right = #right r2} fun between'(r1 : region, r2 : region) = {left = #right r1, right = #left r2} fun transform f (i1 : info, i2 : info) = {file = #file i1, region = f(#region i1, #region i2)} val over = transform over' val between = transform between' fun comparePos({abs = pos1, ...} : pos, {abs = pos2, ...} : pos) = Int.compare(pos1, pos2) fun compareRegion(r1 : region, r2 : region) = case comparePos(#left r1, #left r2) of EQUAL => comparePos(#right r1, #right r2) | order => order fun compare(i1 : info, i2 : info) = compareRegion(#region i1, #region i2) end