content: -----------------------------------------------------------------------------
  -- |
  -- 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 (mkAttributesList)
  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 = mkAttributesList
     [ (specialEqName, primitive 2 eq)
     , (specialStrName, primitive 1 str)
     ]
  
  eq :: Procedure
  eq [None, None] = return true
  eq _ = Prelude.return false
  
  str :: Procedure 
  str _ = Prelude.return $ string "None" 
  