{-# LANGUAGE OverloadedStrings #-}
module SMR.Prim.Op.Sym where
import SMR.Prim.Op.Base
import SMR.Core.Exp.Base


-- | Primitive evaluator for symbol operators.
primOpsSym :: Eq s => [PrimEval s Prim w]
primOpsSym
 = [ primOpSymEq ]


-- | Check equality of two symbols.
primOpSymEq :: Eq s => PrimEval s Prim w
primOpSymEq
 = PrimEval
        (PrimOp "sym-eq")
        ("check equality of two symbols")
        [PVal, PVal] fn'
 where
        fn' _world as0
         | Just (XRef (RSym n1), as1) <- takeArgExp as0
         , Just (XRef (RSym n2), [])  <- takeArgExp as1
         = return $ Just
                  $ if n1 == n2 then XRef $ RPrm $ PrimLitBool True
                                else XRef $ RPrm $ PrimLitBool False
        fn' _world _
         = return $ Nothing