    -- Copyright © 2011 National Institute of Aerospace / Galois, Inc.

    -- | Let expressions.
    --
    -- Although Copilot is a DSL embedded in Haskell and Haskell does support let
    -- expressions, we want Copilot to be able to implement sharing, to detect when
    -- the same stream is being used in multiple places in a specification and
    -- avoid recomputing it unnecessarily.

    {-# LANGUAGE Safe #-}

    module Copilot.Language.Operators.Local
      ( local
      ) where

    import Copilot.Core (Typed)
    import Copilot.Language.Stream (Stream (..))

    -- | Let expressions.
    --
    --   Create a stream that results from applying a stream to a function on
    --   streams. Standard usage would be similar to Haskell's let. See the
    --   following example, where @stream1@, @stream2@ and @s@ are all streams
    --   carrying values of some numeric type:
    --
    --   @
    --   expression = local (stream1 + stream2) $ \\s ->
    --                (s >= 0 && s <= 10)
    --   @
    local :: (Typed a, Typed b) => Stream a -> (Stream a -> Stream b) -> Stream b
    local :: forall a b.
    (Typed a, Typed b) =>
    Stream a -> (Stream a -> Stream b) -> Stream b
    local = Stream a -> (Stream a -> Stream b) -> Stream b
    forall a b.
    (Typed a, Typed b) =>
    Stream a -> (Stream a -> Stream b) -> Stream b
    Local