module struct import StdEnv import StdGeneric import StdDebug import Text import Data.Functor import Control.Applicative :: Structmaker a = SM (Int [String] -> [String]) | Onzin a runSM :: (Structmaker a) -> (Int [String] -> [String]) runSM (SM a) = a generic gToStruct a :: Structmaker a gToStruct{|Int|} = SM \_ c->["int":c] gToStruct{|Real|} = SM \_ c->["double":c] gToStruct{|Bool|} = SM \_ c->["bool":c] gToStruct{|UNIT|} = SM \_->id gToStruct{|EITHER|} fl fr = SM \i->runSM fl i o runSM fr i gToStruct{|PAIR|} fl fr = SM \i c->runSM fl i [" f", toString i, "; ":runSM fr (i+1) c] gToStruct{|OBJECT of gtd|} f | gtd.gtd_num_conses == 0 = SM (runSM f) = SM \i c-> ["struct clean_", gtd.gtd_name, " {\n" ,"uint8_t cons;\n" ,"union {\n" :runSM f i ["} data;\n" ,"}":c]] gToStruct{|CONS of gcd|} f = SM \i c->["struct { ":runSM f i ["} ", gcd.gcd_name, ";\n":c]] gToStruct{|RECORD of grd|} f = SM \i c-> ["struct clean_", grd.grd_name, " {\n" :runSM f i ["}":c]] gToStruct{|FIELD of gfd|} f = SM \i c->runSM f i [gfd.gfd_name,";\n":c] :: DHTDetails = DHT Int Bool | SHT Addr | XXX Int Int Int | XXY Int Int Int :: Addr =: Addr Int :: DHTType = DHT11 | DHT12 | DHT22 derive gToStruct DHTDetails derive gToStruct DHTType derive gToStruct Addr derive gToStruct Record Start = (concat (runSM s 0 []) ,concat (runSM s` 0 []) ) :: Record = { field1 :: Int , field2 :: Bool , field3 :: DHTType } s :: (Structmaker DHTDetails) s = gToStruct{|*|} s` :: (Structmaker Record) s` = gToStruct{|*|}