copilot-language-3.9: src/Copilot/Language/Operators/Mux.hs
-- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
{-# LANGUAGE Safe #-}
-- | Pick values from one of two streams, depending whether a condition is true
-- or false.
module Copilot.Language.Operators.Mux
( mux
, ifThenElse
) where
import Copilot.Core (Typed, typeOf)
import qualified Copilot.Core as Core
import Copilot.Language.Prelude
import Copilot.Language.Stream
import Prelude ()
-- | Convenient synonym for 'ifThenElse'.
mux :: Typed a => Stream Bool -> Stream a -> Stream a -> Stream a
mux (Const True) t _ = t
mux (Const False) _ f = f
mux b t f = Op3 (Core.Mux typeOf) b t f
-- | If-then-else applied point-wise to three streams (a condition stream, a
-- then-branch stream, and an else-branch stream).
--
-- Produce a stream that, at any point in time, if the value of the first
-- stream at that point is true, contains the value in the second stream at
-- that time, otherwise it contains the value in the third stream.
ifThenElse :: Typed a => Stream Bool -> Stream a -> Stream a -> Stream a
ifThenElse = mux