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


{-# LANGUAGE Safe #-}

-- | Temporal stream transformations.
module Copilot.Language.Operators.Temporal
  ( (++)
  , drop
  ) where

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

--------------------------------------------------------------------------------

infixr 1 ++

-- | Prepend a fixed number of samples to a stream.
--
-- The elements to be appended at the beginning of the stream must be limited,
-- that is, the list must have finite length.
--
-- Prepending elements to a stream may increase the memory requirements of the
-- generated programs (which now must hold the same number of elements in
-- memory for future processing).
(++) :: Typed a => [a] -> Stream a -> Stream a
(++) = (`Append` Nothing)

-- | Drop a number of samples from a stream.
--
-- The elements must be realizable at the present time to be able to drop
-- elements. For most kinds of streams, you cannot drop elements without
  prepending an equal or greater number of elements to them first , as it
-- could result in undefined samples.
drop :: Typed a => Int -> Stream a -> Stream a
drop 0 s             = s
drop _ ( Const j )   = Const j
drop i ( Drop  j s ) = Drop (fromIntegral i + j) s
drop i s             = Drop (fromIntegral i)     s

------------------------------------------------------------------------------
------------------------------------------------------------------------------
# LANGUAGE Safe #
 | Temporal stream transformations.
------------------------------------------------------------------------------
 | Prepend a fixed number of samples to a stream.

 The elements to be appended at the beginning of the stream must be limited,
 that is, the list must have finite length.

 Prepending elements to a stream may increase the memory requirements of the
 generated programs (which now must hold the same number of elements in
 memory for future processing).
 | Drop a number of samples from a stream.

 The elements must be realizable at the present time to be able to drop
 elements. For most kinds of streams, you cannot drop elements without
 could result in undefined samples.
  Copyright © 2011 National Institute of Aerospace / Galois , Inc.



module Copilot.Language.Operators.Temporal
  ( (++)
  , drop
  ) where

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


infixr 1 ++

(++) :: Typed a => [a] -> Stream a -> Stream a
(++) = (`Append` Nothing)

  prepending an equal or greater number of elements to them first , as it
drop :: Typed a => Int -> Stream a -> Stream a
drop 0 s             = s
drop _ ( Const j )   = Const j
drop i ( Drop  j s ) = Drop (fromIntegral i + j) s
drop i s             = Drop (fromIntegral i)     s
