From ce7652c6189b289ffbc749dc3d1ffb465c758c01 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 26 Jul 2024 12:22:07 +0200 Subject: Add types for name analysis --- lib/Language/Elna/Location.hs | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 lib/Language/Elna/Location.hs (limited to 'lib/Language/Elna/Location.hs') diff --git a/lib/Language/Elna/Location.hs b/lib/Language/Elna/Location.hs new file mode 100644 index 0000000..918ef46 --- /dev/null +++ b/lib/Language/Elna/Location.hs @@ -0,0 +1,58 @@ +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] -- cgit v1.2.3