-----------------------------------------------------------------------------
-- |
-- Module      : Berp.Base.Builtins.Utils
-- Copyright   : (c) 2010 Bernie Pope
-- License     : BSD-style
-- Maintainer  : florbitous@gmail.com
-- Stability   : experimental
-- Portability : ghc
--
-- Support code for making builtins.
--
-----------------------------------------------------------------------------

module Berp.Base.Builtins.Utils (primFun, primConstant) where

import Data.IORef (newIORef)
import Berp.Base.Ident (Ident)
import Berp.Base.SemanticTypes (Arity, Procedure, ObjectRef, Object)
import Berp.Base.Prims (primitive)
import Berp.Base.Monad (constantIO) 

primFun :: Ident -> Arity -> Procedure -> ObjectRef 
primFun _ident arity proc = constantIO $ do
   let primitiveObj = primitive arity proc 
   newIORef primitiveObj 

primConstant :: Object -> ObjectRef
primConstant = constantIO . newIORef