summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind/CId.hs
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2013-12-10 16:11:47 +0000
committerkr.angelov <kr.angelov@gmail.com>2013-12-10 16:11:47 +0000
commit0851308099f625bb451f80e62e33137df199322f (patch)
treea2758d78b2e3ae4df7c04e3f50bd9860332f8076 /src/runtime/haskell-bind/CId.hs
parent97d56065c4f03d7004c1f32ede2ff93ced1e7757 (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.hs56
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