59 lines
1.4 KiB
Haskell
59 lines
1.4 KiB
Haskell
|
module Language.Elna.Location
|
||
|
( Identifier(..)
|
||
|
, Location(..)
|
||
|
, Node(..)
|
||
|
, showArrayType
|
||
|
) where
|
||
|
|
||
|
import Data.Hashable (Hashable(..))
|
||
|
import Data.String (IsString(..))
|
||
|
import Data.Text (Text)
|
||
|
import qualified Data.Text as Text
|
||
|
import Data.Word (Word32)
|
||
|
|
||
|
data Location = Location
|
||
|
{ line :: Word32
|
||
|
, column :: Word32
|
||
|
} deriving (Eq, Show)
|
||
|
|
||
|
instance Semigroup Location
|
||
|
where
|
||
|
(Location thisLine thisColumn) <> (Location thatLine thatColumn) = Location
|
||
|
{ line = thisLine + thatLine
|
||
|
, column = thisColumn + thatColumn
|
||
|
}
|
||
|
|
||
|
instance Monoid Location
|
||
|
where
|
||
|
mempty = Location{ line = 1, column = 1 }
|
||
|
|
||
|
data Node a = Node a Location
|
||
|
deriving (Eq, Show)
|
||
|
|
||
|
instance Functor Node
|
||
|
where
|
||
|
fmap f (Node node location) = Node (f node) location
|
||
|
|
||
|
newtype Identifier = Identifier { unIdentifier :: Text }
|
||
|
deriving Eq
|
||
|
|
||
|
instance Show Identifier
|
||
|
where
|
||
|
show (Identifier identifier) = Text.unpack identifier
|
||
|
|
||
|
instance IsString Identifier
|
||
|
where
|
||
|
fromString = Identifier . Text.pack
|
||
|
|
||
|
instance Ord Identifier
|
||
|
where
|
||
|
compare (Identifier lhs) (Identifier rhs) = compare lhs rhs
|
||
|
|
||
|
instance Hashable Identifier
|
||
|
where
|
||
|
hashWithSalt salt (Identifier identifier) = hashWithSalt salt identifier
|
||
|
|
||
|
showArrayType :: Show a => Word32 -> a -> String
|
||
|
showArrayType elementCount typeName = concat
|
||
|
["array[", show elementCount, "] of ", show typeName]
|