-- | Declares data types which describe valid declarations and valid type 
--   signatures. A declaration or type signature is valid when all checks (see
--   "Language.Haskell.FreeTheorems.Frontend") were passed successfully.

module Language.Haskell.FreeTheorems.ValidSyntax where



import Data.Generics (Typeable, Data)
import Data.Maybe (mapMaybe)

import Language.Haskell.FreeTheorems.BasicSyntax



-- | Marks a valid declaration.

data ValidDeclaration = ValidDeclaration 
  { ValidDeclaration -> Declaration
rawDeclaration :: Declaration 
        -- ^ Returns the declaration structure hidden in a valid declaration.

  , ValidDeclaration -> Bool
isStrictDeclaration :: Bool
        -- ^ Indicates whether the declarations declares or depends on an 
        --   algebraic data type with strictness flag.
  }



-- | Marks a valid type signature.

newtype ValidSignature = ValidSignature 
  { ValidSignature -> Signature
rawSignature :: Signature
        -- ^ Returns the signature structure hidden in a valid type signature.
  }



-- | Extracts all type signatures from a list of declarations.

filterSignatures :: [ValidDeclaration] -> [ValidSignature]
filterSignatures :: [ValidDeclaration] -> [ValidSignature]
filterSignatures = forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ValidDeclaration -> Maybe ValidSignature
asSignature
  where 
    asSignature :: ValidDeclaration -> Maybe ValidSignature
asSignature (ValidDeclaration Declaration
decl Bool
_) = 
      case Declaration
decl of
        TypeSig Signature
sig -> forall a. a -> Maybe a
Just (Signature -> ValidSignature
ValidSignature Signature
sig)
        Declaration
otherwise   -> forall a. Maybe a
Nothing