-----------------------------------------------------------------------------
-- |
-- Module      : Berp.Base.StdTypes.Function
-- Copyright   : (c) 2010 Bernie Pope
-- License     : BSD-style
-- Maintainer  : florbitous@gmail.com
-- Stability   : experimental
-- Portability : ghc
--
-- The standard function type.
--
-----------------------------------------------------------------------------

module Berp.Base.StdTypes.Function (function, functionClass) where

import Berp.Base.Monad (constantIO)
import Berp.Base.SemanticTypes (Object (..), Procedure)
import Berp.Base.Identity (newIdentity)
import Berp.Base.Attributes (mkAttributes)
import Berp.Base.StdTypes.Dictionary (emptyDictionary)
import {-# SOURCE #-} Berp.Base.StdTypes.Type (newType)
import Berp.Base.StdTypes.ObjectBase (objectBase)
import Berp.Base.StdTypes.String (string)

{-# NOINLINE function #-}
function :: Int -> Procedure -> Object 
function arity p = constantIO $ do 
   identity <- newIdentity
   dict <- emptyDictionary
   return $
      Function 
      { object_identity = identity 
      , object_dict = dict 
      , object_procedure = p
      , object_arity = arity
      }

{-# NOINLINE functionClass #-}
functionClass :: Object
functionClass = constantIO $ do 
   dict <- attributes
   newType [string "function", objectBase, dict]

-- XXX update my attributes
attributes :: IO Object 
attributes = mkAttributes []