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

module Berp.Base.StdTypes.None (none, noneIdentity, noneClass) where

import Berp.Base.Prims (primitive)
import Berp.Base.Monad (constantIO)
import Berp.Base.SemanticTypes (Procedure, Object (..))
import Berp.Base.StdTypes.Bool (true, false)
import Berp.Base.Identity (newIdentity, Identity)
import Berp.Base.Attributes (mkAttributes)
import Berp.Base.StdNames
import {-# SOURCE #-} Berp.Base.StdTypes.Type (newType)
import Berp.Base.StdTypes.ObjectBase (objectBase)
import Berp.Base.StdTypes.String (string)

none :: Object 
none = None 

{-# NOINLINE noneIdentity #-}
noneIdentity :: Identity
noneIdentity = constantIO newIdentity

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

attributes :: IO Object 
attributes = mkAttributes 
   [ (eqName, primitive 2 eq)
   , (strName, primitive 1 str)
   ]
        
eq :: Procedure 
eq [None, None] = return true 
eq _ = Prelude.return false 

str :: Procedure 
str _ = Prelude.return $ string "None"