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