diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2013-12-10 16:11:47 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2013-12-10 16:11:47 +0000 |
| commit | 0851308099f625bb451f80e62e33137df199322f (patch) | |
| tree | a2758d78b2e3ae4df7c04e3f50bd9860332f8076 /src/runtime/haskell-bind/CId.hs | |
| parent | 97d56065c4f03d7004c1f32ede2ff93ced1e7757 (diff) | |
move src/runtime/haskell/CRuntimeFFI to src/runtime/haskell-bind. Don't mess up with the stable Haskell runtime!
Diffstat (limited to 'src/runtime/haskell-bind/CId.hs')
| -rw-r--r-- | src/runtime/haskell-bind/CId.hs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/runtime/haskell-bind/CId.hs b/src/runtime/haskell-bind/CId.hs new file mode 100644 index 000000000..74db63c2c --- /dev/null +++ b/src/runtime/haskell-bind/CId.hs @@ -0,0 +1,56 @@ +module CId (CId(..), + mkCId, wildCId, + readCId, showCId, + + -- utils + pCId, pIdent, ppCId) where + +import Control.Monad +import qualified Data.ByteString.Char8 as BS +import Data.Char +import qualified Text.ParserCombinators.ReadP as RP +import qualified Text.PrettyPrint as PP + + + +-- | An abstract data type that represents +-- identifiers for functions and categories in PGF. +newtype CId = CId BS.ByteString deriving (Eq,Ord) + +wildCId :: CId +wildCId = CId (BS.singleton '_') + +-- | Creates a new identifier from 'String' +mkCId :: String -> CId +mkCId s = CId (BS.pack s) + +-- | Reads an identifier from 'String'. The function returns 'Nothing' if the string is not valid identifier. +readCId :: String -> Maybe CId +readCId s = case [x | (x,cs) <- RP.readP_to_S pCId s, all isSpace cs] of + [x] -> Just x + _ -> Nothing + +-- | Renders the identifier as 'String' +showCId :: CId -> String +showCId (CId x) = BS.unpack x + +instance Show CId where + showsPrec _ = showString . showCId + +instance Read CId where + readsPrec _ = RP.readP_to_S pCId + +pCId :: RP.ReadP CId +pCId = do s <- pIdent + if s == "_" + then RP.pfail + else return (mkCId s) + +pIdent :: RP.ReadP String +pIdent = liftM2 (:) (RP.satisfy isIdentFirst) (RP.munch isIdentRest) + where + isIdentFirst c = c == '_' || isLetter c + isIdentRest c = c == '_' || c == '\'' || isAlphaNum c + +ppCId :: CId -> PP.Doc +ppCId = PP.text . showCId |
