{-|
Module      : Input
Description : Defines input structure
Copyright   : (c) David Janin, Simon Archipoff, 2016
License     : see the LICENSE file in the distribution
Maintainer  : janin@labri.fr
Stability   : experimental

Defines timed list of temporal values (aka atoms) that can be created and updated on the fly from inputs.

-}


{-# OPTIONS_GHC -Wall -fno-warn-name-shadowing #-}

{-# LANGUAGE GADTs,
             MultiParamTypeClasses,
             FlexibleInstances,
             FlexibleContexts #-}

module Reactive.Input where

--------------------------------------------------------------------
-- * Input lists of temporal values (actual version)
--------------------------------------------------------------------

-- Faire de l'entrée un arbre binaire indexé avec deux types d'identifiant d'ID
-- DID i (delay) VID (durée note), la fonction copycatQ se chargeant d'aglomérer
-- les notes reçues (via reduceQ) en même temps pour en faire une qlist...

-- | Input qlists, built over duration type 'd' and input value type 'iv'
data InQList d iv where
     InQList :: [(d,iv)] -> IDQ d iv -> InQList d iv
     InQUndef :: InQList d iv
     InQEnd ::  InQList d iv
         deriving (Show)

-- | Input delayed qlists, built over duration type 'd' and input value type 'iv'
-- with invariant property
--
-- prop> In every value (IDQ d iv) we should have (partialCompare 0 d) == Just LT
    
data IDQ d iv = IDQ d (InQList d iv)
         deriving (Show)