module BrownPLT.JavaScript.Contracts.Types where

import qualified Data.List as L
import Text.ParserCombinators.Parsec.Pos (SourcePos)
import BrownPLT.JavaScript.Parser (ParsedExpression, ParsedStatement)

data Contract
  = FlatContract SourcePos ParsedExpression
  | NamedContract SourcePos String
  | FunctionContract SourcePos [Contract] (Maybe Contract) Contract
  | ConstructorContract SourcePos String [Contract]
  | FixedArrayContract SourcePos [Contract]
  | ArrayContract SourcePos Contract
  | ObjectContract SourcePos [(String,Contract)]
  deriving (Show)


contractPos :: Contract -> SourcePos
contractPos ctc = case ctc of
  FlatContract p _ -> p
  NamedContract p _ -> p
  FunctionContract p _ _ _ -> p
  ConstructorContract p _ _ -> p
  FixedArrayContract p _ -> p
  ArrayContract p _ -> p
  ObjectContract p _ -> p

data InterfaceItem 
  = InterfaceExport String SourcePos Contract
  | InterfaceAlias String Contract
  | InterfaceStatement { interfaceStatement :: ParsedStatement }
  | InterfaceInstance String SourcePos Contract -- ^always an object contract
  deriving (Show)

isInterfaceStatement (InterfaceStatement _) = True
isInterfaceStatement _ = False

isInterfaceExport (InterfaceExport{}) = True
isInterfaceExport _ = False

isInterfaceAlias (InterfaceAlias{}) = True
isInterfaceAlias _ = False

isInterfaceInstance (InterfaceInstance{}) = True
isInterfaceInstance _ = False