packages feed

live-sequencer-0.0.6.1: src/SourceText.hs

module SourceText where

import qualified ModuleBase as Module

import qualified Text.ParserCombinators.Parsec.Pos as ParsecPos
import Text.ParserCombinators.Parsec ( CharParser, getPosition )


data Position = Position !Int !Int
    deriving (Eq, Ord, Show)

initialPos :: Position
initialPos = Position 1 1

parsecPos :: ParsecPos.SourcePos -> Position
parsecPos pos =
    Position (ParsecPos.sourceLine pos) (ParsecPos.sourceColumn pos)

makeParsecPos :: Module.Name -> Position -> ParsecPos.SourcePos
makeParsecPos (Module.Name modu) (Position line column) =
    ParsecPos.newPos modu line column


data Range = Range { start, stop :: Position }
    deriving (Eq, Ord, Show)

data ModuleRange = ModuleRange Module.Name (Maybe Module.Version) Range
    deriving (Eq, Ord, Show)

emptyRange :: Range
emptyRange = Range initialPos initialPos

emptyModuleRange :: Module.Name -> ModuleRange
emptyModuleRange name = ModuleRange name Module.noVersion emptyRange

extractModuleName :: ModuleRange -> Module.Name
extractModuleName (ModuleRange n _ _) = n

extractModuleRange :: ModuleRange -> Range
extractModuleRange (ModuleRange _ _ rng) = rng

setRangeNoVersion :: Range -> ModuleRange
setRangeNoVersion = ModuleRange Module.noName Module.noVersion

setRangeSourceName :: Module.Name -> Module.Version -> Range -> ModuleRange
setRangeSourceName name vers = ModuleRange name (Just vers)


class ParserRange range where
    consRange :: ParsecPos.SourcePos -> ParsecPos.SourcePos -> range

instance ParserRange Range where
    consRange from to = Range (parsecPos from) (parsecPos to)


ranged :: (ParserRange range) => CharParser st a -> CharParser st (range, a)
ranged p = do
    from <- getPosition
    x <- p
    to <- getPosition
    return (consRange from to, x)