module Curry.Base.SpanInfo
( SpanInfo(..), HasSpanInfo(..)
, fromSrcSpan, fromSrcSpanBoth, getSrcSpan, setSrcSpan
, fromSrcInfoPoints, getSrcInfoPoints, setSrcInfoPoints
, getStartPosition, getSrcSpanEnd, setStartPosition, setEndPosition
, spanInfo2Pos
) where
import Curry.Base.Position
import Curry.Base.Span
data SpanInfo = SpanInfo
{ srcSpan :: Span
, srcInfoPoints :: [Span]
}
| NoSpanInfo
deriving (Eq, Read, Show)
class HasPosition a => HasSpanInfo a where
getSpanInfo :: a -> SpanInfo
setSpanInfo :: SpanInfo -> a -> a
updateEndPos :: a -> a
updateEndPos = id
instance HasSpanInfo SpanInfo where
getSpanInfo = id
setSpanInfo = const
instance HasPosition SpanInfo where
getPosition = getStartPosition
setPosition = setStartPosition
fromSrcSpan :: Span -> SpanInfo
fromSrcSpan sp = SpanInfo sp []
fromSrcSpanBoth :: Span -> SpanInfo
fromSrcSpanBoth sp = SpanInfo sp [sp]
getSrcSpan :: HasSpanInfo a => a -> Span
getSrcSpan a = case getSpanInfo a of
NoSpanInfo -> NoSpan
SpanInfo s _ -> s
setSrcSpan :: HasSpanInfo a => Span -> a -> a
setSrcSpan s a = case getSpanInfo a of
NoSpanInfo -> setSpanInfo (SpanInfo s []) a
SpanInfo _ inf -> setSpanInfo (SpanInfo s inf) a
fromSrcInfoPoints :: [Span] -> SpanInfo
fromSrcInfoPoints = SpanInfo NoSpan
getSrcInfoPoints :: HasSpanInfo a => a -> [Span]
getSrcInfoPoints a = case getSpanInfo a of
NoSpanInfo -> []
SpanInfo _ xs -> xs
setSrcInfoPoints :: HasSpanInfo a => [Span] -> a -> a
setSrcInfoPoints inf a = case getSpanInfo a of
NoSpanInfo -> setSpanInfo (SpanInfo NoSpan inf) a
SpanInfo s _ -> setSpanInfo (SpanInfo s inf) a
getStartPosition :: HasSpanInfo a => a -> Position
getStartPosition a = case getSrcSpan a of
NoSpan -> NoPos
Span _ s _ -> s
getSrcSpanEnd :: HasSpanInfo a => a -> Position
getSrcSpanEnd a = case getSpanInfo a of
NoSpanInfo -> NoPos
(SpanInfo s _) -> end s
setStartPosition :: HasSpanInfo a => Position -> a -> a
setStartPosition p a = case getSrcSpan a of
NoSpan -> setSrcSpan (Span "" p NoPos) a
(Span f _ e) -> setSrcSpan (Span f p e) a
setEndPosition :: HasSpanInfo a => Position -> a -> a
setEndPosition e a = case getSrcSpan a of
NoSpan -> setSrcSpan (Span "" NoPos e) a
(Span f p _) -> setSrcSpan (Span f p e) a
spanInfo2Pos :: HasSpanInfo a => a -> Position
spanInfo2Pos = getStartPosition