implementation module Data.GenType.CType
import Control.Applicative
-import Control.Monad => qualified join
+import Control.Monad
import Control.Monad.Fail
import Control.Monad.Reader
import Control.Monad.State
import Data.Maybe
import Data.Tuple
import StdEnv
-import Text
+import qualified Text
+from Text import class Text(concat), instance Text String
instance MonadFail (Either String) where fail s = Left s
ftd (TyObject ti fs) tl
= indent ["struct ", if tl (safe ti.gtd_name) "", " {\n"]
>>| iindent (indent []) >>| enum ti fs >>| tell [" cons;\n"]
- >>| indent [] >>| enum ti fs >>| tell [" cons;\n"]
- >>| indent ["struct {\n"]
+ >>| iindent (indent ["struct {\n"])
>>| mapM_ (iindent o iindent o fmtCons) fs
>>| iindent (indent ["} data;\n"])
>>| indent ["}", if tl ";" ""]
>>| indent ["} ", safe ci.gcd_name, ";\n"]
ftd t tl = fail $ "cannot flatTypedef: " +++ toString t
-
enum :: GenericTypeDefDescriptor [(GenericConsDescriptor, [Type])] -> FTMonad
enum ti fs = liftT (gets (lookup ti.gtd_name)) >>= \e->case e of
- ?None = liftT (modify \s->[(ti.gtd_name, [consName ti, " {", join ", " [safe ci.gcd_name\\(ci, _)<-fs], "};\n"]):s]) >>| enum ti fs
+ ?None = liftT (modify \s->[(ti.gtd_name, [consName ti, " {", 'Text'.join ", " [safe ci.gcd_name\\(ci, _)<-fs], "};\n"]):s]) >>| enum ti fs
?Just _ = tell [consName ti]
fmtField :: (String, Type) -> FTMonad
//Enumeration
typedef t=:(TyObject ti fs)
| and [t =: [] \\ (_, t)<-fs] = header t
- [consName ti, " {", join ", " [safe ci.gcd_name\\(ci, _)<-fs], "};\n"]
+ [consName ti, " {", 'Text'.join ", " [safe ci.gcd_name\\(ci, _)<-fs], "};\n"]
//Single constructor, single field (box)
typedef t=:(TyObject ti [(ci, [ty])]) = header t [] >>| tydef ti.gtd_name ci.gcd_type
//Single constructor
//Complex adt
typedef t=:(TyObject ti fs) = header t
["struct ", safe ti.gtd_name, " {\n"
- , "\tenum {", join ", " [safe ci.gcd_name\\(ci, _)<-fs], "} cons;\n"
+ , "\t", consName ti, " {", 'Text'.join ", " [safe ci.gcd_name\\(ci, _)<-fs], "} cons;\n"
, "\tstruct {\n"]
>>| mapM_ fmtCons fs
>>| tell ["\t} data;\n};\n"]
fmtField x (GenTypeApp l r) = fmtField x l
fmtField x t=:(GenTypeArrow _ _)
= mapM (fmap (concat o snd) o listen o fmtField "") (collectArgs t [])
- >>= \[r:as]->tell [r, " (*",x,")(",join ", " as, ")"]
+ >>= \[r:as]->tell [r, " (*",x,")(",'Text'.join ", " as, ")"]
where
collectArgs (GenTypeArrow l r) c = collectArgs r (c ++ [l])
collectArgs t c = [t:c]