Revision 3929e782 htools/Ganeti/THH.hs
b/htools/Ganeti/THH.hs | ||
---|---|---|
535 | 535 |
cons |
536 | 536 |
let declD = DataD [] tname [] decl_d [''Show, ''Eq] |
537 | 537 |
|
538 |
let (allfsig, allffn) = genAllOpFields "allOpFields" cons |
|
538 | 539 |
(savesig, savefn) <- genSaveOpCode tname "saveOpCode" cons |
539 | 540 |
(uncurry saveConstructor) |
540 | 541 |
(loadsig, loadfn) <- genLoadOpCode cons |
541 |
return [declD, loadsig, loadfn, savesig, savefn] |
|
542 |
return [declD, allfsig, allffn, loadsig, loadfn, savesig, savefn] |
|
543 |
|
|
544 |
-- | Generates the function pattern returning the list of fields for a |
|
545 |
-- given constructor. |
|
546 |
genOpConsFields :: (String, [Field]) -> Clause |
|
547 |
genOpConsFields (cname, fields) = |
|
548 |
let op_id = deCamelCase cname |
|
549 |
fvals = map (LitE . StringL) . sort . nub $ |
|
550 |
concatMap (\f -> fieldName f:fieldExtraKeys f) fields |
|
551 |
in Clause [LitP (StringL op_id)] (NormalB $ ListE fvals) [] |
|
552 |
|
|
553 |
-- | Generates a list of all fields of an opcode constructor. |
|
554 |
genAllOpFields :: String -- ^ Function name |
|
555 |
-> [(String, [Field])] -- ^ Object definition |
|
556 |
-> (Dec, Dec) |
|
557 |
genAllOpFields sname opdefs = |
|
558 |
let cclauses = map genOpConsFields opdefs |
|
559 |
other = Clause [WildP] (NormalB (ListE [])) [] |
|
560 |
fname = mkName sname |
|
561 |
sigt = AppT (AppT ArrowT (ConT ''String)) (AppT ListT (ConT ''String)) |
|
562 |
in (SigD fname sigt, FunD fname (cclauses++[other])) |
|
542 | 563 |
|
543 | 564 |
-- | Generates the \"save\" clause for an entire opcode constructor. |
544 | 565 |
-- |
Also available in: Unified diff