content: -- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
  
  {-# LANGUAGE Safe #-}
  
  -- | Equality applied point-wise on streams.
  module Copilot.Language.Operators.Eq
    ( (==)
    , (/=)
    ) where
  
  import Copilot.Core (Typed, typeOf)
  import qualified Copilot.Core as Core
  import Copilot.Language.Prelude
  import Copilot.Language.Stream
  import qualified Prelude as P
  
  -- | Compare two streams point-wise for equality.
  --
  -- The output stream contains the value True at a point in time if both
  -- argument streams contain the same value at that point in time.
  (==) :: (P.Eq a, Typed a) => Stream a -> Stream a -> Stream Bool
  (Const x) == (Const y) = Const (x P.== y)
  x == y = Op2 (Core.Eq typeOf) x y
  
  -- | Compare two streams point-wise for inequality.
  --
  -- The output stream contains the value True at a point in time if both
  -- argument streams contain different values at that point in time.
  (/=) :: (P.Eq a, Typed a) => Stream a -> Stream a -> Stream Bool
  (Const x) /= (Const y) = Const (x P./= y)
  x /= y = Op2 (Core.Ne typeOf) x y
  