------------------------------------------------------------------------
-- |
-- Module           : What4.FunctionName
-- Description      : Declarations for function names.
-- Copyright        : (c) Galois, Inc 2014-2020
-- License          : BSD3
-- Maintainer       : Joe Hendrix <jhendrix@galois.com>
-- Stability        : provisional
--
-- This provides a basic data type for function names.
------------------------------------------------------------------------
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module What4.FunctionName
  ( -- * FunctionName
    FunctionName
  , functionName
  , functionNameFromText
  , startFunctionName
  ) where

import           Data.Hashable
import           Data.String
import qualified Data.Text as Text
import qualified Prettyprinter as PP

------------------------------------------------------------------------
-- FunctionName

-- | For our purposes, a function name is just unicode text.
-- Individual languages may want to further restrict names.
newtype FunctionName = FunctionName { FunctionName -> Text
functionName :: Text.Text }
  deriving (FunctionName -> FunctionName -> Bool
(FunctionName -> FunctionName -> Bool)
-> (FunctionName -> FunctionName -> Bool) -> Eq FunctionName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FunctionName -> FunctionName -> Bool
$c/= :: FunctionName -> FunctionName -> Bool
== :: FunctionName -> FunctionName -> Bool
$c== :: FunctionName -> FunctionName -> Bool
Eq, Eq FunctionName
Eq FunctionName
-> (FunctionName -> FunctionName -> Ordering)
-> (FunctionName -> FunctionName -> Bool)
-> (FunctionName -> FunctionName -> Bool)
-> (FunctionName -> FunctionName -> Bool)
-> (FunctionName -> FunctionName -> Bool)
-> (FunctionName -> FunctionName -> FunctionName)
-> (FunctionName -> FunctionName -> FunctionName)
-> Ord FunctionName
FunctionName -> FunctionName -> Bool
FunctionName -> FunctionName -> Ordering
FunctionName -> FunctionName -> FunctionName
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FunctionName -> FunctionName -> FunctionName
$cmin :: FunctionName -> FunctionName -> FunctionName
max :: FunctionName -> FunctionName -> FunctionName
$cmax :: FunctionName -> FunctionName -> FunctionName
>= :: FunctionName -> FunctionName -> Bool
$c>= :: FunctionName -> FunctionName -> Bool
> :: FunctionName -> FunctionName -> Bool
$c> :: FunctionName -> FunctionName -> Bool
<= :: FunctionName -> FunctionName -> Bool
$c<= :: FunctionName -> FunctionName -> Bool
< :: FunctionName -> FunctionName -> Bool
$c< :: FunctionName -> FunctionName -> Bool
compare :: FunctionName -> FunctionName -> Ordering
$ccompare :: FunctionName -> FunctionName -> Ordering
$cp1Ord :: Eq FunctionName
Ord, Int -> FunctionName -> Int
FunctionName -> Int
(Int -> FunctionName -> Int)
-> (FunctionName -> Int) -> Hashable FunctionName
forall a. (Int -> a -> Int) -> (a -> Int) -> Hashable a
hash :: FunctionName -> Int
$chash :: FunctionName -> Int
hashWithSalt :: Int -> FunctionName -> Int
$chashWithSalt :: Int -> FunctionName -> Int
Hashable)

instance IsString FunctionName where
  fromString :: String -> FunctionName
fromString String
s = Text -> FunctionName
FunctionName (String -> Text
forall a. IsString a => String -> a
fromString String
s)

instance Show FunctionName where
  show :: FunctionName -> String
show (FunctionName Text
nm) = Text -> String
Text.unpack Text
nm

instance PP.Pretty FunctionName where
  pretty :: FunctionName -> Doc ann
pretty (FunctionName Text
nm) = Text -> Doc ann
forall a ann. Pretty a => a -> Doc ann
PP.pretty Text
nm

-- | Name of function for starting simulator.
startFunctionName :: FunctionName
startFunctionName :: FunctionName
startFunctionName = String -> FunctionName
forall a. IsString a => String -> a
fromString String
"_start"

functionNameFromText :: Text.Text -> FunctionName
functionNameFromText :: Text -> FunctionName
functionNameFromText = Text -> FunctionName
FunctionName