content: -- |
  -- Module      : FRP.Dunai.InternalCore
  -- Copyright   : (c) Ivan Perez, 2014-2022
  --               (c) George Giorgidze, 2007-2012
  --               (c) Henrik Nilsson, 2005-2006
  --               (c) Antony Courtney and Henrik Nilsson, Yale University, 2003-2004
  -- License     : BSD-style (see the LICENSE file in the distribution)
  --
  -- Maintainer  : ivan.perez@keera.co.uk
  -- Stability   : provisional
  -- Portability : non-portable (GHC extensions)
  --
  -- Domain-specific language embedded in Haskell for programming hybrid (mixed
  -- discrete-time and continuous-time) systems, extended with Monads.
  --
  -- Bearriver (a tributary to the Yampa river) provides the same API as Yampa,
  -- but implemented using Monadic Stream Functions underneath. SFs in BearRiver
  -- take an additional monad as argument. The introduction of time is done by
  -- means of an additional Reader layer.
  module FRP.BearRiver.InternalCore
      ( module Control.Arrow
  
        -- * Basic definitions
        -- ** Time
      , Time
      , DTime
  
        -- ** Signal Functions
      , SF
      , ClockInfo
      )
    where
  
  -- External imports
  import Control.Arrow (Arrow (..), ArrowChoice (..), ArrowLoop (..), (>>>))
  
  -- Internal imports (dunai)
  import Control.Monad.Trans.MSF    (ReaderT)
  import Data.MonadicStreamFunction (MSF)
  
  -- * Basic type definitions with associated utilities
  
  -- | Time is used both for time intervals (duration), and time w.r.t. some
  -- agreed reference point in time.
  type Time = Double
  
  -- | DTime is the time type for lengths of sample intervals. Conceptually,
  -- DTime = R+ = { x in R | x > 0 }. Don't assume Time and DTime have the same
  -- representation.
  type DTime = Double
  
  -- | Extensible signal function (signal function with a notion of time, but
  -- which can be extended with actions).
  --
  -- Signal function that transforms a signal carrying values of some type 'a'
  -- into a signal carrying values of some type 'b'. You can think of it as
  -- (Signal a -> Signal b). A signal is, conceptually, a function from 'Time' to
  -- value.
  type SF m = MSF (ClockInfo m)
  
  -- | Information on the progress of time.
  type ClockInfo m = ReaderT DTime m
  