    ------------------------------------------------------------------------
    -- |
    -- 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
    $c== :: FunctionName -> FunctionName -> Bool
    == :: FunctionName -> FunctionName -> Bool
    $c/= :: FunctionName -> FunctionName -> Bool
    /= :: 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
    $ccompare :: FunctionName -> FunctionName -> Ordering
    compare :: FunctionName -> FunctionName -> Ordering
    $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
    >= :: FunctionName -> FunctionName -> Bool
    $cmax :: FunctionName -> FunctionName -> FunctionName
    max :: FunctionName -> FunctionName -> FunctionName
    $cmin :: FunctionName -> FunctionName -> FunctionName
    min :: FunctionName -> FunctionName -> FunctionName
    Ord, Eq FunctionName
    Eq FunctionName
    -> (Int -> FunctionName -> Int)
    -> (FunctionName -> Int)
    -> Hashable FunctionName
    Int -> FunctionName -> Int
    FunctionName -> Int
    forall a. Eq a -> (Int -> a -> Int) -> (a -> Int) -> Hashable a
    $chashWithSalt :: Int -> FunctionName -> Int
    hashWithSalt :: Int -> FunctionName -> Int
    $chash :: FunctionName -> Int
    hash :: 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 :: forall ann. FunctionName -> Doc ann
    pretty (FunctionName Text
    nm) = Text -> Doc ann
    forall ann. 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