packages feed

Hs2lib-0.5.0: WinDll/Structs/Folds/C.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  Windll
-- Copyright   :  (c) Tamar Christina 2009 - 2010
-- License     :  BSD3
-- 
-- Maintainer  :  tamar@zhox.com
-- Stability   :  experimental
-- Portability :  portable
--
-- General Folds for the Haskell-Src-Exts datatypes
--
-----------------------------------------------------------------------------
module WinDll.Structs.Folds.C where

import WinDll.Structs.C
import WinDll.Structs.Types
import WinDll.Structs.Structures(Callback)
import WinDll.Session.Hs2lib(CallConvention)

-- * Type Algebras for the current ADTs in the C file

-- | Type Algebra for the Include ADT
type IncludeAlgebra a = (Name -> a
                        ,Name -> a
                        )

-- | Type Algebra for the DataEnum ADT                        
type DataEnumAlgebra a = (Name -> [String] -> a)

-- | Type Algebra for the CDataType ADT
type CDataTypeAlgebra a = (a
                          ,a
                          ,a
                          ,a
                          )
                          
-- | Type Algebra for the FieldType ADT
type FieldTypeAlgebra a =(a
                         ,a
                         )
                          
-- | Type Algebra for the DataFieldType ADT
type DataFieldTypeAlgebra a =(a
                            ,a
                            )
                          
-- | Type Algebra for the DataField ADT
type DataFieldAlgebra a = (DataFieldType -> CDataType -> Name -> TypeName -> [a] -> a
                          ,CDataType -> TypeName -> FieldType -> (Maybe Name) -> a
                          ,CDataType -> Name -> a
                          )
                   
-- | Type Algebra for the C ADT                   
type CAlgebra a = ([Include] -> CallConvention -> [Callback] -> [DataEnum] -> [DataField] -> [DataField] -> a)

-- * The general folds used with the ADTs defined in the C file

-- | General fold for the Include ADT
foldInclude :: IncludeAlgebra a -> Include -> a
foldInclude (lib,local) = fold
    where fold (LibInclude   a) = lib a
          fold (LocalInclude a) = local a

-- | General fold for the DataEnum ADT          
foldDataEnum :: DataEnumAlgebra a -> DataEnum -> a
foldDataEnum (dataenum) = fold
    where fold (DataEnum a b) = dataenum a b
    
-- | General fold for the CDataType ADT
foldCDataType :: CDataTypeAlgebra a -> CDataType -> a
foldCDataType (struct,union,dnum,val) = fold
    where fold Struct = struct
          fold Union  = union
          fold ENum   = dnum
          fold VAlue  = val
          
-- | General fold for the FieldType ADT
foldFieldType :: FieldTypeAlgebra a -> FieldType -> a
foldFieldType (normal,pointer) = fold
    where fold Normal  = normal
          fold Pointer = pointer 
          
-- | General fold for the DataFieldType ADT
foldDataFieldType :: DataFieldTypeAlgebra a -> DataFieldType -> a
foldDataFieldType (typedef,normaldef) = fold
    where fold TypeDef   = typedef
          fold NormalDef = normaldef
          
-- | General fold for the DataField ADT
foldDataField :: DataFieldAlgebra a -> DataField -> a
foldDataField (field,value,forw) = fold
    where fold (Field x a b c d) = field x a b c (map fold d)
          fold (Value   a b c d) = value a b c d
          fold (Forward     a b) = a `forw` b
          
-- | General fold for the C ADT
foldC :: CAlgebra a -> C -> a
foldC (ccons) = fold
    where fold (C a b c d e f) = ccons a b c d e f