-----------------------------------------------------------------------------
-- |
-- Module  :  ForSyDe.Shallow.MoC.SADF
-- Copyright   :  (c) Ricardo Bonna, KTH/ICT/ES, ForSyDe-Group
-- License     :  BSD-style (see the file LICENSE)
--
-- Maintainer  :  ricardobonna@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Experimental lib. Further test needed
--
-----------------------------------------------------------------------------

module ForSyDe.Shallow.MoC.SADF (
  -- * Sequential Process Constructors
  -- | Sequential process constructors are used for processes that
  -- have a state. One of the input parameters is the initial state.
  delaySADF,
  -- * Kernels
  -- | Based on the process constructors in the SADF-MoC, the
  -- SADF-library provides SADF-kernels with single or multiple inputs
  kernel11SADF, kernel12SADF, kernel13SADF, kernel14SADF, kernel15SADF,
  kernel21SADF, kernel22SADF, kernel23SADF, kernel24SADF, kernel25SADF,
  kernel31SADF, kernel32SADF, kernel33SADF, kernel34SADF, kernel35SADF,
  kernel41SADF, kernel42SADF, kernel43SADF, kernel44SADF, kernel45SADF,
  kernel51SADF, kernel52SADF, kernel53SADF, kernel54SADF, kernel55SADF,
  -- * Detectors
  -- | Based on the process constructors in the SADF-MoC, the
  -- SADF-library provides SADF-detectors with single or multiple inputs
  detector11SADF, detector12SADF, detector13SADF, detector14SADF, detector15SADF,
  detector21SADF, detector22SADF, detector23SADF, detector24SADF, detector25SADF,
  detector31SADF, detector32SADF, detector33SADF, detector34SADF, detector35SADF,
  detector41SADF, detector42SADF, detector43SADF, detector44SADF, detector45SADF,
  detector51SADF, detector52SADF, detector53SADF, detector54SADF, detector55SADF
  ) where

import ForSyDe.Shallow.Core


-------------------------------------
--             --
-- SEQUENTIAL PROCESS CONSTRUCTORS --
--             --
-------------------------------------

-- | The process constructor 'delaynSADF' delays the signal n event
--   cycles by introducing n initial values at the beginning of the
--   output signal.
delaySADF :: [a] -> Signal a -> Signal a
delaySADF :: [a] -> Signal a -> Signal a
delaySADF [a]
initial_tokens Signal a
xs = [a] -> Signal a
forall a. [a] -> Signal a
signal [a]
initial_tokens Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
xs


------------------------------------------------------------------------
--
-- SADF KERNELS
--
------------------------------------------------------------------------

-- > Kernels with one output

-- | The process constructor 'kernel11SADF' constructs an SADF kernel with
-- one data input and one data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel11SADF :: Signal (Int, Int, [a] -> [b]) -- ^ Control signal
             -> Signal a                      -- ^ Input
             -> Signal b                      -- ^ Output
kernel11SADF :: Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
kernel11SADF = Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
forall a b. Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF

-- | The process constructor 'kernel21SADF' constructs an SADF kernel with
-- two data input and one data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel21SADF :: Signal ((Int, Int), Int, [a] -> [b] -> [c])
             -> Signal a -> Signal b
             -> Signal c
kernel21SADF :: Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
kernel21SADF = Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
forall a b c.
Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF

-- | The process constructor 'kernel31SADF' constructs an SADF kernel with
-- three data input and one data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel31SADF :: Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
             -> Signal a -> Signal b -> Signal c
             -> Signal d
kernel31SADF :: Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
kernel31SADF = Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
forall a b c d.
Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF

-- | The process constructor 'kernel41SADF' constructs an SADF kernel with
-- four data input and one data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel41SADF :: Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
             -> Signal a -> Signal b -> Signal c -> Signal d
             -> Signal e
kernel41SADF :: Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
kernel41SADF = Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
forall a b c d e.
Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF

-- | The process constructor 'kernel51SADF' constructs an SADF kernel with
-- five data input and one data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel51SADF :: Signal ((Int, Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e] -> [f])
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
             -> Signal f
kernel51SADF :: Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
kernel51SADF = Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
forall a b c d e f.
Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF


-- > Kernels with two outputs

-- | The process constructor 'kernel12SADF' constructs an SADF kernel with
-- one data input and two data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel12SADF :: Signal (Int, (Int, Int), [a] -> ([b], [c]))
             -> Signal a
             -> (Signal b, Signal c)
kernel12SADF :: Signal (Int, (Int, Int), [a] -> ([b], [c]))
-> Signal a -> (Signal b, Signal c)
kernel12SADF Signal (Int, (Int, Int), [a] -> ([b], [c]))
ct Signal a
xs = [(Int, Int)] -> Signal ([b], [c]) -> (Signal b, Signal c)
forall a b.
[(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF (Signal (Int, (Int, Int), [a] -> ([b], [c])) -> [(Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal (Int, (Int, Int), [a] -> ([b], [c]))
ct) (Signal ([b], [c]) -> (Signal b, Signal c))
-> Signal ([b], [c]) -> (Signal b, Signal c)
forall a b. (a -> b) -> a -> b
$ Signal (Int, Int, [a] -> [([b], [c])])
-> Signal a -> Signal ([b], [c])
forall a b. Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF (Signal (Int, (Int, Int), [a] -> ([b], [c]))
-> Signal (Int, Int, [a] -> [([b], [c])])
forall it ot a y.
Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n Signal (Int, (Int, Int), [a] -> ([b], [c]))
ct) Signal a
xs

-- | The process constructor 'kernel22SADF' constructs an SADF kernel with
-- two data input and two data output signals. The scenario (token rates and
-- function) is determined by the control signal.
--
-- >>> let scen1 = ((1,1), (1,1), \[a] [b] -> ([2*a], [2*b]))
-- >>> let scen2 = ((2,2), (1,1), \[a,b] [c,d] -> ([a+b], [c+d]))
-- >>> let scen3 = ((1,2), (2,1), \[a] [b,c] -> ([b,c], [a]))
-- >>> let sc = signal [scen1, scen2, scen3]
-- >>> kernel22SADF sc (signal [1..20]) (signal [21 .. 40])
-- ({2,5,24,25},{42,45,4}) 
kernel22SADF :: Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
             -> Signal a -> Signal b
             -> (Signal c, Signal d)
kernel22SADF :: Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
-> Signal a -> Signal b -> (Signal c, Signal d)
kernel22SADF Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
ct Signal a
xs Signal b
ys = [(Int, Int)] -> Signal ([c], [d]) -> (Signal c, Signal d)
forall a b.
[(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF (Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
-> [(Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
ct) (Signal ([c], [d]) -> (Signal c, Signal d))
-> Signal ([c], [d]) -> (Signal c, Signal d)
forall a b. (a -> b) -> a -> b
$ Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d])])
-> Signal a -> Signal b -> Signal ([c], [d])
forall a b c.
Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF (Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
-> Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d])])
forall it ot a b y.
Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
ct) Signal a
xs Signal b
ys

-- | The process constructor 'kernel32SADF' constructs an SADF kernel with
-- three data input and two data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel32SADF :: Signal ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
             -> Signal a -> Signal b -> Signal c
             -> (Signal d, Signal e)
kernel32SADF :: Signal
  ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
-> Signal a -> Signal b -> Signal c -> (Signal d, Signal e)
kernel32SADF Signal
  ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
ct Signal a
as Signal b
bs Signal c
cs
  = [(Int, Int)] -> Signal ([d], [e]) -> (Signal d, Signal e)
forall a b.
[(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF (Signal
  ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
-> [(Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
ct) (Signal ([d], [e]) -> (Signal d, Signal e))
-> Signal ([d], [e]) -> (Signal d, Signal e)
forall a b. (a -> b) -> a -> b
$ Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [([d], [e])])
-> Signal a -> Signal b -> Signal c -> Signal ([d], [e])
forall a b c d.
Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF (Signal
  ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
-> Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [([d], [e])])
forall it ot a b c y.
Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n Signal
  ((Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> ([d], [e]))
ct) Signal a
as Signal b
bs Signal c
cs

-- | The process constructor 'kernel42SADF' constructs an SADF kernel with
-- four data input and two data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel42SADF :: Signal ((Int, Int, Int, Int), (Int, Int), [a] -> [b] -> [c] -> [d] -> ([e], [f]))
             -> Signal a -> Signal b -> Signal c -> Signal d
             -> (Signal e, Signal f)
kernel42SADF :: Signal
  ((Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal e, Signal f)
kernel42SADF Signal
  ((Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds
  = [(Int, Int)] -> Signal ([e], [f]) -> (Signal e, Signal f)
forall a b.
[(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF (Signal
  ((Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f]))
-> [(Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f]))
ct) (Signal ([e], [f]) -> (Signal e, Signal f))
-> Signal ([e], [f]) -> (Signal e, Signal f)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [([e], [f])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal ([e], [f])
forall a b c d e.
Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF (Signal
  ((Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f]))
-> Signal
     ((Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [([e], [f])])
forall it ot a b c d y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n Signal
  ((Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds

-- | The process constructor 'kernel52SADF' constructs an SADF kernel with
-- five data input and two data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel52SADF :: Signal ((Int, Int, Int, Int, Int), (Int, Int), [a]
             -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
             -> (Signal f, Signal g)
kernel52SADF :: Signal
  ((Int, Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal f, Signal g)
kernel52SADF Signal
  ((Int, Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
  = [(Int, Int)] -> Signal ([f], [g]) -> (Signal f, Signal g)
forall a b.
[(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
-> [(Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
ct) (Signal ([f], [g]) -> (Signal f, Signal g))
-> Signal ([f], [g]) -> (Signal f, Signal g)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal ([f], [g])
forall a b c d e f.
Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
-> Signal
     ((Int, Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g])])
forall it ot a b c d e y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n Signal
  ((Int, Int, Int, Int, Int), (Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es


-- > Kernels with three outputs

-- | The process constructor 'kernel13SADF' constructs an SADF kernel with
-- one data input and three data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel13SADF :: Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
             -> Signal a
             -> (Signal b, Signal c, Signal d)
kernel13SADF :: Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
-> Signal a -> (Signal b, Signal c, Signal d)
kernel13SADF Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
ct Signal a
xs = [(Int, Int, Int)]
-> Signal ([b], [c], [d]) -> (Signal b, Signal c, Signal d)
forall a b c.
[(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF (Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
-> [(Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
ct) (Signal ([b], [c], [d]) -> (Signal b, Signal c, Signal d))
-> Signal ([b], [c], [d]) -> (Signal b, Signal c, Signal d)
forall a b. (a -> b) -> a -> b
$ Signal (Int, Int, [a] -> [([b], [c], [d])])
-> Signal a -> Signal ([b], [c], [d])
forall a b. Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF (Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
-> Signal (Int, Int, [a] -> [([b], [c], [d])])
forall it ot a y.
Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n Signal (Int, (Int, Int, Int), [a] -> ([b], [c], [d]))
ct) Signal a
xs

-- | The process constructor 'kernel23SADF' constructs an SADF kernel with
-- two data input and three data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel23SADF :: Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
             -> Signal a -> Signal b
             -> (Signal c, Signal d, Signal e)
kernel23SADF :: Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
-> Signal a -> Signal b -> (Signal c, Signal d, Signal e)
kernel23SADF Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
ct Signal a
xs Signal b
ys = [(Int, Int, Int)]
-> Signal ([c], [d], [e]) -> (Signal c, Signal d, Signal e)
forall a b c.
[(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF (Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
-> [(Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
ct) (Signal ([c], [d], [e]) -> (Signal c, Signal d, Signal e))
-> Signal ([c], [d], [e]) -> (Signal c, Signal d, Signal e)
forall a b. (a -> b) -> a -> b
$ Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d], [e])])
-> Signal a -> Signal b -> Signal ([c], [d], [e])
forall a b c.
Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF (Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
-> Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d], [e])])
forall it ot a b y.
Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n Signal ((Int, Int), (Int, Int, Int), [a] -> [b] -> ([c], [d], [e]))
ct) Signal a
xs Signal b
ys

-- | The process constructor 'kernel33SADF' constructs an SADF kernel with
-- three data input and three data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel33SADF :: Signal ((Int, Int, Int), (Int, Int, Int), [a] -> [b] -> [c] -> ([d], [e], [f]))
             -> Signal a -> Signal b -> Signal c
             -> (Signal d, Signal e, Signal f)
kernel33SADF :: Signal
  ((Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f]))
-> Signal a
-> Signal b
-> Signal c
-> (Signal d, Signal e, Signal f)
kernel33SADF Signal
  ((Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f]))
ct Signal a
as Signal b
bs Signal c
cs
  = [(Int, Int, Int)]
-> Signal ([d], [e], [f]) -> (Signal d, Signal e, Signal f)
forall a b c.
[(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF (Signal
  ((Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f]))
-> [(Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f]))
ct) (Signal ([d], [e], [f]) -> (Signal d, Signal e, Signal f))
-> Signal ([d], [e], [f]) -> (Signal d, Signal e, Signal f)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [([d], [e], [f])])
-> Signal a -> Signal b -> Signal c -> Signal ([d], [e], [f])
forall a b c d.
Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF (Signal
  ((Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f]))
-> Signal
     ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [([d], [e], [f])])
forall it ot a b c y.
Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n Signal
  ((Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f]))
ct) Signal a
as Signal b
bs Signal c
cs

-- | The process constructor 'kernel43SADF' constructs an SADF kernel with
-- four data input and three data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel43SADF :: Signal ((Int, Int, Int, Int), (Int, Int, Int),
             [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
             -> Signal a -> Signal b -> Signal c -> Signal d
             -> (Signal e, Signal f, Signal g)
kernel43SADF :: Signal
  ((Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal e, Signal f, Signal g)
kernel43SADF Signal
  ((Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds
  = [(Int, Int, Int)]
-> Signal ([e], [f], [g]) -> (Signal e, Signal f, Signal g)
forall a b c.
[(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF (Signal
  ((Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
-> [(Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
ct) (Signal ([e], [f], [g]) -> (Signal e, Signal f, Signal g))
-> Signal ([e], [f], [g]) -> (Signal e, Signal f, Signal g)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [([e], [f], [g])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal ([e], [f], [g])
forall a b c d e.
Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF (Signal
  ((Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
-> Signal
     ((Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [([e], [f], [g])])
forall it ot a b c d y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n Signal
  ((Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds

-- | The process constructor 'kernel53SADF' constructs an SADF kernel with
-- five data input and three data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel53SADF :: Signal ((Int, Int, Int, Int, Int), (Int, Int, Int),
             [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
             -> (Signal f, Signal g, Signal h)
kernel53SADF :: Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal f, Signal g, Signal h)
kernel53SADF Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
  = [(Int, Int, Int)]
-> Signal ([f], [g], [h]) -> (Signal f, Signal g, Signal h)
forall a b c.
[(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
-> [(Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
ct) (Signal ([f], [g], [h]) -> (Signal f, Signal g, Signal h))
-> Signal ([f], [g], [h]) -> (Signal f, Signal g, Signal h)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g], [h])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal ([f], [g], [h])
forall a b c d e f.
Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
-> Signal
     ((Int, Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g], [h])])
forall it ot a b c d e y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es


-- > Kernels with four outputs

-- | The process constructor 'kernel14SADF' constructs an SADF kernel with
-- one data input and four data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel14SADF :: Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
             -> Signal a
             -> (Signal b, Signal c, Signal d, Signal e)
kernel14SADF :: Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
-> Signal a -> (Signal b, Signal c, Signal d, Signal e)
kernel14SADF Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
ct Signal a
xs = [(Int, Int, Int, Int)]
-> Signal ([b], [c], [d], [e])
-> (Signal b, Signal c, Signal d, Signal e)
forall a b c d.
[(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF (Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
-> [(Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
ct) (Signal ([b], [c], [d], [e])
 -> (Signal b, Signal c, Signal d, Signal e))
-> Signal ([b], [c], [d], [e])
-> (Signal b, Signal c, Signal d, Signal e)
forall a b. (a -> b) -> a -> b
$ Signal (Int, Int, [a] -> [([b], [c], [d], [e])])
-> Signal a -> Signal ([b], [c], [d], [e])
forall a b. Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF (Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
-> Signal (Int, Int, [a] -> [([b], [c], [d], [e])])
forall it ot a y.
Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n Signal (Int, (Int, Int, Int, Int), [a] -> ([b], [c], [d], [e]))
ct) Signal a
xs

-- | The process constructor 'kernel24SADF' constructs an SADF kernel with
-- two data input and four data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel24SADF :: Signal ((Int, Int), (Int, Int, Int, Int), [a] -> [b] -> ([c], [d], [e], [f]))
             -> Signal a -> Signal b
             -> (Signal c, Signal d, Signal e, Signal f)
kernel24SADF :: Signal
  ((Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f]))
-> Signal a -> Signal b -> (Signal c, Signal d, Signal e, Signal f)
kernel24SADF Signal
  ((Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f]))
ct Signal a
xs Signal b
ys = [(Int, Int, Int, Int)]
-> Signal ([c], [d], [e], [f])
-> (Signal c, Signal d, Signal e, Signal f)
forall a b c d.
[(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF (Signal
  ((Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f]))
-> [(Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f]))
ct) (Signal ([c], [d], [e], [f])
 -> (Signal c, Signal d, Signal e, Signal f))
-> Signal ([c], [d], [e], [f])
-> (Signal c, Signal d, Signal e, Signal f)
forall a b. (a -> b) -> a -> b
$ Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d], [e], [f])])
-> Signal a -> Signal b -> Signal ([c], [d], [e], [f])
forall a b c.
Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF (Signal
  ((Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f]))
-> Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d], [e], [f])])
forall it ot a b y.
Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n Signal
  ((Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f]))
ct) Signal a
xs Signal b
ys

-- | The process constructor 'kernel34SADF' constructs an SADF kernel with
-- three data input and four data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel34SADF :: Signal ((Int, Int, Int), (Int, Int, Int, Int),
             [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
             -> Signal a -> Signal b -> Signal c
             -> (Signal d, Signal e, Signal f, Signal g)
kernel34SADF :: Signal
  ((Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
-> Signal a
-> Signal b
-> Signal c
-> (Signal d, Signal e, Signal f, Signal g)
kernel34SADF Signal
  ((Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
ct Signal a
as Signal b
bs Signal c
cs
  = [(Int, Int, Int, Int)]
-> Signal ([d], [e], [f], [g])
-> (Signal d, Signal e, Signal f, Signal g)
forall a b c d.
[(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF (Signal
  ((Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
-> [(Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
ct) (Signal ([d], [e], [f], [g])
 -> (Signal d, Signal e, Signal f, Signal g))
-> Signal ([d], [e], [f], [g])
-> (Signal d, Signal e, Signal f, Signal g)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [([d], [e], [f], [g])])
-> Signal a -> Signal b -> Signal c -> Signal ([d], [e], [f], [g])
forall a b c d.
Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF (Signal
  ((Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
-> Signal
     ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [([d], [e], [f], [g])])
forall it ot a b c y.
Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n Signal
  ((Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g]))
ct) Signal a
as Signal b
bs Signal c
cs

-- | The process constructor 'kernel44SADF' constructs an SADF kernel with
-- four data input and four data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel44SADF :: Signal ((Int, Int, Int, Int), (Int, Int, Int, Int),
             [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
             -> Signal a -> Signal b -> Signal c -> Signal d
             -> (Signal e, Signal f, Signal g, Signal h)
kernel44SADF :: Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal e, Signal f, Signal g, Signal h)
kernel44SADF Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds
  = [(Int, Int, Int, Int)]
-> Signal ([e], [f], [g], [h])
-> (Signal e, Signal f, Signal g, Signal h)
forall a b c d.
[(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF (Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
-> [(Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
ct) (Signal ([e], [f], [g], [h])
 -> (Signal e, Signal f, Signal g, Signal h))
-> Signal ([e], [f], [g], [h])
-> (Signal e, Signal f, Signal g, Signal h)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [([e], [f], [g], [h])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal ([e], [f], [g], [h])
forall a b c d e.
Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF (Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
-> Signal
     ((Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [([e], [f], [g], [h])])
forall it ot a b c d y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds

-- | The process constructor 'kernel54SADF' constructs an SADF kernel with
-- five data input and four data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel54SADF :: Signal ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
             [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
             -> (Signal f, Signal g, Signal h, Signal i)
kernel54SADF :: Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal f, Signal g, Signal h, Signal i)
kernel54SADF Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
  = [(Int, Int, Int, Int)]
-> Signal ([f], [g], [h], [i])
-> (Signal f, Signal g, Signal h, Signal i)
forall a b c d.
[(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
-> [(Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
ct) (Signal ([f], [g], [h], [i])
 -> (Signal f, Signal g, Signal h, Signal i))
-> Signal ([f], [g], [h], [i])
-> (Signal f, Signal g, Signal h, Signal i)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g], [h], [i])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal ([f], [g], [h], [i])
forall a b c d e f.
Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
-> Signal
     ((Int, Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g], [h], [i])])
forall it ot a b c d e y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es


-- > Kernels with five outputs

-- | The process constructor 'kernel15SADF' constructs an SADF kernel with
-- one data input and five data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel15SADF :: Signal (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
             -> Signal a
             -> (Signal b, Signal c, Signal d, Signal e, Signal f)
kernel15SADF :: Signal
  (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
-> Signal a -> (Signal b, Signal c, Signal d, Signal e, Signal f)
kernel15SADF Signal
  (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
ct Signal a
xs = [(Int, Int, Int, Int, Int)]
-> Signal ([b], [c], [d], [e], [f])
-> (Signal b, Signal c, Signal d, Signal e, Signal f)
forall a b c d e.
[(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF (Signal
  (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
-> [(Int, Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
ct) (Signal ([b], [c], [d], [e], [f])
 -> (Signal b, Signal c, Signal d, Signal e, Signal f))
-> Signal ([b], [c], [d], [e], [f])
-> (Signal b, Signal c, Signal d, Signal e, Signal f)
forall a b. (a -> b) -> a -> b
$ Signal (Int, Int, [a] -> [([b], [c], [d], [e], [f])])
-> Signal a -> Signal ([b], [c], [d], [e], [f])
forall a b. Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF (Signal
  (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
-> Signal (Int, Int, [a] -> [([b], [c], [d], [e], [f])])
forall it ot a y.
Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n Signal
  (Int, (Int, Int, Int, Int, Int), [a] -> ([b], [c], [d], [e], [f]))
ct) Signal a
xs

-- | The process constructor 'kernel25SADF' constructs an SADF kernel with
-- two data input and five data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel25SADF :: Signal ((Int, Int), (Int, Int, Int, Int, Int), [a] -> [b] -> ([c], [d], [e], [f], [g]))
             -> Signal a -> Signal b
             -> (Signal c, Signal d, Signal e, Signal f, Signal g)
kernel25SADF :: Signal
  ((Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f], [g]))
-> Signal a
-> Signal b
-> (Signal c, Signal d, Signal e, Signal f, Signal g)
kernel25SADF Signal
  ((Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f], [g]))
ct Signal a
xs Signal b
ys = [(Int, Int, Int, Int, Int)]
-> Signal ([c], [d], [e], [f], [g])
-> (Signal c, Signal d, Signal e, Signal f, Signal g)
forall a b c d e.
[(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF (Signal
  ((Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f], [g]))
-> [(Int, Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f], [g]))
ct) (Signal ([c], [d], [e], [f], [g])
 -> (Signal c, Signal d, Signal e, Signal f, Signal g))
-> Signal ([c], [d], [e], [f], [g])
-> (Signal c, Signal d, Signal e, Signal f, Signal g)
forall a b. (a -> b) -> a -> b
$ Signal ((Int, Int), Int, [a] -> [b] -> [([c], [d], [e], [f], [g])])
-> Signal a -> Signal b -> Signal ([c], [d], [e], [f], [g])
forall a b c.
Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF (Signal
  ((Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f], [g]))
-> Signal
     ((Int, Int), Int, [a] -> [b] -> [([c], [d], [e], [f], [g])])
forall it ot a b y.
Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n Signal
  ((Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> ([c], [d], [e], [f], [g]))
ct) Signal a
xs Signal b
ys

-- | The process constructor 'kernel35SADF' constructs an SADF kernel with
-- three data input and five data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel35SADF :: Signal ((Int, Int, Int), (Int, Int, Int, Int, Int),
             [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
             -> Signal a -> Signal b -> Signal c
             -> (Signal d, Signal e, Signal f, Signal g, Signal h)
kernel35SADF :: Signal
  ((Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
-> Signal a
-> Signal b
-> Signal c
-> (Signal d, Signal e, Signal f, Signal g, Signal h)
kernel35SADF Signal
  ((Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
ct Signal a
as Signal b
bs Signal c
cs
  = [(Int, Int, Int, Int, Int)]
-> Signal ([d], [e], [f], [g], [h])
-> (Signal d, Signal e, Signal f, Signal g, Signal h)
forall a b c d e.
[(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF (Signal
  ((Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
-> [(Int, Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
ct) (Signal ([d], [e], [f], [g], [h])
 -> (Signal d, Signal e, Signal f, Signal g, Signal h))
-> Signal ([d], [e], [f], [g], [h])
-> (Signal d, Signal e, Signal f, Signal g, Signal h)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [([d], [e], [f], [g], [h])])
-> Signal a
-> Signal b
-> Signal c
-> Signal ([d], [e], [f], [g], [h])
forall a b c d.
Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF (Signal
  ((Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
-> Signal
     ((Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [([d], [e], [f], [g], [h])])
forall it ot a b c y.
Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n Signal
  ((Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> ([d], [e], [f], [g], [h]))
ct) Signal a
as Signal b
bs Signal c
cs

-- | The process constructor 'kernel45SADF' constructs an SADF kernel with
-- four data input and five data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel45SADF :: Signal ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
             [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
             -> Signal a -> Signal b -> Signal c -> Signal d
             -> (Signal e, Signal f, Signal g, Signal h, Signal i)
kernel45SADF :: Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal e, Signal f, Signal g, Signal h, Signal i)
kernel45SADF Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds
  = [(Int, Int, Int, Int, Int)]
-> Signal ([e], [f], [g], [h], [i])
-> (Signal e, Signal f, Signal g, Signal h, Signal i)
forall a b c d e.
[(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF (Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
-> [(Int, Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
ct) (Signal ([e], [f], [g], [h], [i])
 -> (Signal e, Signal f, Signal g, Signal h, Signal i))
-> Signal ([e], [f], [g], [h], [i])
-> (Signal e, Signal f, Signal g, Signal h, Signal i)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [([e], [f], [g], [h], [i])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal ([e], [f], [g], [h], [i])
forall a b c d e.
Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF (Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
-> Signal
     ((Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [([e], [f], [g], [h], [i])])
forall it ot a b c d y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n Signal
  ((Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> ([e], [f], [g], [h], [i]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds

-- | The process constructor 'kernel55SADF' constructs an SADF kernel with
-- five data input and five data output signals. The scenario (token rates and
-- function) is determined by the control signal.
kernel55SADF :: Signal ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
             [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
             -> (Signal f, Signal g, Signal h, Signal i, Signal j)
kernel55SADF :: Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal f, Signal g, Signal h, Signal i, Signal j)
kernel55SADF Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
  = [(Int, Int, Int, Int, Int)]
-> Signal ([f], [g], [h], [i], [j])
-> (Signal f, Signal g, Signal h, Signal i, Signal j)
forall a b c d e.
[(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
-> [(Int, Int, Int, Int, Int)]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
ct) (Signal ([f], [g], [h], [i], [j])
 -> (Signal f, Signal g, Signal h, Signal i, Signal j))
-> Signal ([f], [g], [h], [i], [j])
-> (Signal f, Signal g, Signal h, Signal i, Signal j)
forall a b. (a -> b) -> a -> b
$ Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g], [h], [i], [j])])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal ([f], [g], [h], [i], [j])
forall a b c d e f.
Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF (Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
-> Signal
     ((Int, Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [e] -> [([f], [g], [h], [i], [j])])
forall it ot a b c d e y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n Signal
  ((Int, Int, Int, Int, Int), (Int, Int, Int, Int, Int),
   [a] -> [b] -> [c] -> [d] -> [e] -> ([f], [g], [h], [i], [j]))
ct) Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es


------------------------------------------------------------------------
--
-- SADF DETECTORS
--
------------------------------------------------------------------------

-- > Detectors with one output

-- | The process constructor 'detector11SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with
-- a single data input and a single control output signals.
detector11SADF :: Int                 -- ^ consumption rates (@c@)
               -> (s -> [a] -> s)     -- ^ next state function (@f@)
               -> (s -> (Int, [y]))   -- ^ scenario selection (@g@)
               -> s                   -- ^ initial state (@s0@)
               -> Signal a            -- ^ Input
               -> Signal y            -- ^ Output
detector11SADF :: Int
-> (s -> [a] -> s)
-> (s -> (Int, [y]))
-> s
-> Signal a
-> Signal y
detector11SADF Int
c s -> [a] -> s
f s -> (Int, [y])
g s
s0 Signal a
as = (s -> (Int, [y])) -> Signal s -> Signal y
forall s a. (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [y])
g Signal s
next_state
  where next_state :: Signal s
next_state = Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
forall s a.
Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
c s -> [a] -> s
f Signal s
current_state Signal a
as
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector21SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with two data input and a
-- single control output signals.
detector21SADF :: (Int, Int)
               -> (s -> [a] -> [b] -> s)
               -> (s -> (Int, [y]))
               -> s
               -> Signal a -> Signal b
               -> Signal y
detector21SADF :: (Int, Int)
-> (s -> [a] -> [b] -> s)
-> (s -> (Int, [y]))
-> s
-> Signal a
-> Signal b
-> Signal y
detector21SADF (Int, Int)
c s -> [a] -> [b] -> s
f s -> (Int, [y])
g s
s0 Signal a
as Signal b
bs = (s -> (Int, [y])) -> Signal s -> Signal y
forall s a. (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [y])
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
forall s a b.
(Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int, Int)
c s -> [a] -> [b] -> s
f Signal s
current_state Signal a
as Signal b
bs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector31SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with three data input and a
-- single control output signals.
detector31SADF :: (Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> s)
               -> (s -> (Int, [y]))
               -> s
               -> Signal a -> Signal b -> Signal c
               -> Signal y
detector31SADF :: (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> (s -> (Int, [y]))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal y
detector31SADF (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f s -> (Int, [y])
g s
s0 Signal a
as Signal b
bs Signal c
cs = (s -> (Int, [y])) -> Signal s -> Signal y
forall s a. (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [y])
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
forall s a b c.
(Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector41SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with four data input and a
-- single control output signals.
detector41SADF :: (Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> s)
               -> (s -> (Int, [y]))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d
               -> Signal y
detector41SADF :: (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> (s -> (Int, [y]))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal y
detector41SADF (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f s -> (Int, [y])
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds = (s -> (Int, [y])) -> Signal s -> Signal y
forall s a. (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [y])
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
forall s a b c d.
(Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector51SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with five data input and a
-- single control output signals.
detector51SADF :: (Int, Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
               -> (s -> (Int, [y]))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
               -> Signal y
detector51SADF :: (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> (s -> (Int, [y]))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal y
detector51SADF (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f s -> (Int, [y])
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es = (s -> (Int, [y])) -> Signal s -> Signal y
forall s a. (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [y])
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
forall s a b c d e.
(Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state


-- > Detectors with two output

-- | The process constructor 'detector12SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with a single data input and two
-- control output signals.
detector12SADF :: Int
               -> (s -> [a] -> s)
               -> (s -> ((Int, Int), ([y1], [y2])))
               -> s
               -> Signal a
               -> (Signal y1, Signal y2)
detector12SADF :: Int
-> (s -> [a] -> s)
-> (s -> ((Int, Int), ([y1], [y2])))
-> s
-> Signal a
-> (Signal y1, Signal y2)
detector12SADF Int
c s -> [a] -> s
f s -> ((Int, Int), ([y1], [y2]))
g s
s0 Signal a
as = (s -> ((Int, Int), ([y1], [y2])))
-> Signal s -> (Signal y1, Signal y2)
forall s a b.
(s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([y1], [y2]))
g Signal s
next_state
  where next_state :: Signal s
next_state = Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
forall s a.
Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
c s -> [a] -> s
f Signal s
current_state Signal a
as
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector22SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with two data input and two
-- control output signals.
detector22SADF :: (Int, Int)
               -> (s -> [a] -> [b] -> s)
               -> (s -> ((Int, Int), ([y1], [y2])))
               -> s
               -> Signal a -> Signal b
               -> (Signal y1, Signal y2)
detector22SADF :: (Int, Int)
-> (s -> [a] -> [b] -> s)
-> (s -> ((Int, Int), ([y1], [y2])))
-> s
-> Signal a
-> Signal b
-> (Signal y1, Signal y2)
detector22SADF (Int, Int)
c s -> [a] -> [b] -> s
f s -> ((Int, Int), ([y1], [y2]))
g s
s0 Signal a
as Signal b
bs = (s -> ((Int, Int), ([y1], [y2])))
-> Signal s -> (Signal y1, Signal y2)
forall s a b.
(s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([y1], [y2]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
forall s a b.
(Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int, Int)
c s -> [a] -> [b] -> s
f Signal s
current_state Signal a
as Signal b
bs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector32SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with three data input and two
-- control output signals.
detector32SADF :: (Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> s)
               -> (s -> ((Int, Int), ([y1], [y2])))
               -> s
               -> Signal a -> Signal b -> Signal c
               -> (Signal y1, Signal y2)
detector32SADF :: (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> (s -> ((Int, Int), ([y1], [y2])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> (Signal y1, Signal y2)
detector32SADF (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f s -> ((Int, Int), ([y1], [y2]))
g s
s0 Signal a
as Signal b
bs Signal c
cs = (s -> ((Int, Int), ([y1], [y2])))
-> Signal s -> (Signal y1, Signal y2)
forall s a b.
(s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([y1], [y2]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
forall s a b c.
(Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector42SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with four data input and two
-- control output signals.
detector42SADF :: (Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> s)
               -> (s -> ((Int, Int), ([y1], [y2])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d
               -> (Signal y1, Signal y2)
detector42SADF :: (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> (s -> ((Int, Int), ([y1], [y2])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal y1, Signal y2)
detector42SADF (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f s -> ((Int, Int), ([y1], [y2]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds = (s -> ((Int, Int), ([y1], [y2])))
-> Signal s -> (Signal y1, Signal y2)
forall s a b.
(s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([y1], [y2]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
forall s a b c d.
(Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector52SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with five data input and two
-- control output signals.
detector52SADF :: (Int, Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
               -> (s -> ((Int, Int), ([y1], [y2])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
               -> (Signal y1, Signal y2)
detector52SADF :: (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> (s -> ((Int, Int), ([y1], [y2])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal y1, Signal y2)
detector52SADF (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f s -> ((Int, Int), ([y1], [y2]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es = (s -> ((Int, Int), ([y1], [y2])))
-> Signal s -> (Signal y1, Signal y2)
forall s a b.
(s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([y1], [y2]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
forall s a b c d e.
(Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state


-- > Detectors with three output

-- | The process constructor 'detector13SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with a single data input and three
-- control output signals.
detector13SADF :: Int
               -> (s -> [a] -> s)
               -> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
               -> s
               -> Signal a
               -> (Signal y1, Signal y2, Signal y3)
detector13SADF :: Int
-> (s -> [a] -> s)
-> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> s
-> Signal a
-> (Signal y1, Signal y2, Signal y3)
detector13SADF Int
c s -> [a] -> s
f s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g s
s0 Signal a
as = (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> Signal s -> (Signal y1, Signal y2, Signal y3)
forall s a b c.
(s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g Signal s
next_state
  where next_state :: Signal s
next_state = Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
forall s a.
Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
c s -> [a] -> s
f Signal s
current_state Signal a
as
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector23SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with two data input and three
-- control output signals.
detector23SADF :: (Int, Int)
               -> (s -> [a] -> [b] -> s)
               -> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
               -> s
               -> Signal a -> Signal b
               -> (Signal y1, Signal y2, Signal y3)
detector23SADF :: (Int, Int)
-> (s -> [a] -> [b] -> s)
-> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> s
-> Signal a
-> Signal b
-> (Signal y1, Signal y2, Signal y3)
detector23SADF (Int, Int)
c s -> [a] -> [b] -> s
f s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g s
s0 Signal a
as Signal b
bs = (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> Signal s -> (Signal y1, Signal y2, Signal y3)
forall s a b c.
(s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
forall s a b.
(Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int, Int)
c s -> [a] -> [b] -> s
f Signal s
current_state Signal a
as Signal b
bs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector33SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with three data input and three
-- control output signals.
detector33SADF :: (Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> s)
               -> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
               -> s
               -> Signal a -> Signal b -> Signal c
               -> (Signal y1, Signal y2, Signal y3)
detector33SADF :: (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> (Signal y1, Signal y2, Signal y3)
detector33SADF (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g s
s0 Signal a
as Signal b
bs Signal c
cs = (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> Signal s -> (Signal y1, Signal y2, Signal y3)
forall s a b c.
(s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
forall s a b c.
(Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector43SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with four data input and three
-- control output signals.
detector43SADF :: (Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> s)
               -> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d
               -> (Signal y1, Signal y2, Signal y3)
detector43SADF :: (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal y1, Signal y2, Signal y3)
detector43SADF (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds = (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> Signal s -> (Signal y1, Signal y2, Signal y3)
forall s a b c.
(s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
forall s a b c d.
(Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector53SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with five data input and three
-- control output signals.
detector53SADF :: (Int, Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
               -> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
               -> (Signal y1, Signal y2, Signal y3)
detector53SADF :: (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal y1, Signal y2, Signal y3)
detector53SADF (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es = (s -> ((Int, Int, Int), ([y1], [y2], [y3])))
-> Signal s -> (Signal y1, Signal y2, Signal y3)
forall s a b c.
(s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([y1], [y2], [y3]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
forall s a b c d e.
(Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state


-- > Detectors with four output

-- | The process constructor 'detector14SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with a single data input and four
-- control output signals.
detector14SADF :: Int
               -> (s -> [a] -> s)
               -> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
               -> s
               -> Signal a
               -> (Signal y1, Signal y2, Signal y3, Signal y4)
detector14SADF :: Int
-> (s -> [a] -> s)
-> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> s
-> Signal a
-> (Signal y1, Signal y2, Signal y3, Signal y4)
detector14SADF Int
c s -> [a] -> s
f s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g s
s0 Signal a
as = (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> Signal s -> (Signal y1, Signal y2, Signal y3, Signal y4)
forall s a b c d.
(s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g Signal s
next_state
  where next_state :: Signal s
next_state = Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
forall s a.
Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
c s -> [a] -> s
f Signal s
current_state Signal a
as
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector24SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with two data input and four
-- control output signals.
detector24SADF :: (Int, Int)
               -> (s -> [a] -> [b] -> s)
               -> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
               -> s
               -> Signal a -> Signal b
               -> (Signal y1, Signal y2, Signal y3, Signal y4)
detector24SADF :: (Int, Int)
-> (s -> [a] -> [b] -> s)
-> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> s
-> Signal a
-> Signal b
-> (Signal y1, Signal y2, Signal y3, Signal y4)
detector24SADF (Int, Int)
c s -> [a] -> [b] -> s
f s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g s
s0 Signal a
as Signal b
bs = (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> Signal s -> (Signal y1, Signal y2, Signal y3, Signal y4)
forall s a b c d.
(s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
forall s a b.
(Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int, Int)
c s -> [a] -> [b] -> s
f Signal s
current_state Signal a
as Signal b
bs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector34SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with three data input and four
-- control output signals.
detector34SADF :: (Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> s)
               -> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
               -> s
               -> Signal a -> Signal b -> Signal c
               -> (Signal y1, Signal y2, Signal y3, Signal y4)
detector34SADF :: (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> (Signal y1, Signal y2, Signal y3, Signal y4)
detector34SADF (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g s
s0 Signal a
as Signal b
bs Signal c
cs = (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> Signal s -> (Signal y1, Signal y2, Signal y3, Signal y4)
forall s a b c d.
(s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
forall s a b c.
(Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector44SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with four data input and four
-- control output signals.
detector44SADF :: (Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> s)
               -> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d
               -> (Signal y1, Signal y2, Signal y3, Signal y4)
detector44SADF :: (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal y1, Signal y2, Signal y3, Signal y4)
detector44SADF (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds = (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> Signal s -> (Signal y1, Signal y2, Signal y3, Signal y4)
forall s a b c d.
(s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
forall s a b c d.
(Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector54SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with five data input and four
-- control output signals.
detector54SADF :: (Int, Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
               -> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
               -> (Signal y1, Signal y2, Signal y3, Signal y4)
detector54SADF :: (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal y1, Signal y2, Signal y3, Signal y4)
detector54SADF (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es = (s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4])))
-> Signal s -> (Signal y1, Signal y2, Signal y3, Signal y4)
forall s a b c d.
(s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([y1], [y2], [y3], [y4]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
forall s a b c d e.
(Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state


-- > Detectors with five output

-- | The process constructor 'detector15SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with a single data input and five
-- control output signals.
detector15SADF :: Int
               -> (s -> [a] -> s)
               -> (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
               -> s
               -> Signal a
               -> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector15SADF :: Int
-> (s -> [a] -> s)
-> (s
    -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> s
-> Signal a
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector15SADF Int
c s -> [a] -> s
f s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g s
s0 Signal a
as = (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> Signal s
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
forall s a b c d e.
(s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g Signal s
next_state
  where next_state :: Signal s
next_state = Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
forall s a.
Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
c s -> [a] -> s
f Signal s
current_state Signal a
as
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector25SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with two data input and five
-- control output signals.
detector25SADF :: (Int, Int)
               -> (s -> [a] -> [b] -> s)
               -> (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
               -> s
               -> Signal a -> Signal b
               -> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector25SADF :: (Int, Int)
-> (s -> [a] -> [b] -> s)
-> (s
    -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> s
-> Signal a
-> Signal b
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector25SADF (Int, Int)
c s -> [a] -> [b] -> s
f s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g s
s0 Signal a
as Signal b
bs = (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> Signal s
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
forall s a b c d e.
(s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
forall s a b.
(Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int, Int)
c s -> [a] -> [b] -> s
f Signal s
current_state Signal a
as Signal b
bs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector35SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with three data input and five
-- control output signals.
detector35SADF :: (Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> s)
               -> (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
               -> s
               -> Signal a -> Signal b -> Signal c
               -> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector35SADF :: (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> (s
    -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector35SADF (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g s
s0 Signal a
as Signal b
bs Signal c
cs = (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> Signal s
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
forall s a b c d e.
(s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
forall s a b c.
(Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int, Int, Int)
c s -> [a] -> [b] -> [c] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector45SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with four data input and five
-- control output signals.
detector45SADF :: (Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> s)
               -> (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d
               -> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector45SADF :: (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> (s
    -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector45SADF (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds = (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> Signal s
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
forall s a b c d e.
(s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
forall s a b c d.
(Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state

-- | The process constructor 'detector55SADF' takes the consumption token rate
-- (@c@), the state transition function (@f@), the scenario selection (@g@) and
-- the initial state (@s0@), and constructs an SADF detector with five data input and five
-- control output signals.
detector55SADF :: (Int, Int, Int, Int, Int)
               -> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
               -> (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
               -> s
               -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
               -> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector55SADF :: (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> (s
    -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
detector55SADF (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g s
s0 Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es = (s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5])))
-> Signal s
-> (Signal y1, Signal y2, Signal y3, Signal y4, Signal y5)
forall s a b c d e.
(s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([y1], [y2], [y3], [y4], [y5]))
g Signal s
next_state
  where next_state :: Signal s
next_state = (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
forall s a b c d e.
(Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int, Int, Int, Int, Int)
c s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f Signal s
current_state Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
        current_state :: Signal s
current_state = [s] -> Signal s -> Signal s
forall a. [a] -> Signal a -> Signal a
delaySADF [s
s0] Signal s
next_state


------------------------------------------------------------------------
-- COMBINATIONAL PROCESS CONSTRUCTORS (not exported)
------------------------------------------------------------------------

-- | The process constructor 'mapSADF' takes a signal of scenarios
-- (tuples with the consumed and produced tokens as well as a function operating
-- on lists), and results in an SADF-process that takes an input signal and results
-- in an output signal
mapSADF :: Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF :: Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF Signal (Int, Int, [a] -> [b])
NullS Signal a
_ = Signal b
forall a. Signal a
NullS
mapSADF Signal (Int, Int, [a] -> [b])
ct Signal a
xs
  | Int
c Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [Char] -> Signal b
forall a. HasCallStack => [Char] -> a
error [Char]
"mapSADF: Number of consumed tokens must be a non-negative integer"
  | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c Signal a
xs  = Signal b
forall a. Signal a
NullS
  | Bool
otherwise = if [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
produced_tokens Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
p then
                  [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
produced_tokens Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
forall a b. Signal (Int, Int, [a] -> [b]) -> Signal a -> Signal b
mapSADF (Signal (Int, Int, [a] -> [b]) -> Signal (Int, Int, [a] -> [b])
forall a. Signal a -> Signal a
tailS Signal (Int, Int, [a] -> [b])
ct) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c Signal a
xs)
                else
                  [Char] -> Signal b
forall a. HasCallStack => [Char] -> a
error [Char]
"mapSADF: Function does not produce correct number of tokens"
  where (Int
c, Int
p, [a] -> [b]
f) = Signal (Int, Int, [a] -> [b]) -> (Int, Int, [a] -> [b])
forall a. Signal a -> a
headS Signal (Int, Int, [a] -> [b])
ct
        consumed_tokens :: [a]
consumed_tokens = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c Signal a
xs
        produced_tokens :: [b]
produced_tokens = [a] -> [b]
f [a]
consumed_tokens


-- | The process constructor 'zipWithSADF' takes a signal of scenarios
-- (tuples with the consumed and produced tokens as well as a function operating
-- on lists), and results in an SADF-process that takes two input signals and
-- results in an output signal
zipWithSADF :: Signal ((Int, Int), Int, [a] -> [b] -> [c])
            -> Signal a -> Signal b -> Signal c
zipWithSADF :: Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF Signal ((Int, Int), Int, [a] -> [b] -> [c])
NullS Signal a
_ Signal b
_ = Signal c
forall a. Signal a
NullS
zipWithSADF Signal ((Int, Int), Int, [a] -> [b] -> [c])
ct Signal a
as Signal b
bs
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0  = [Char] -> Signal c
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWithSADF: Number of consumed tokens must be a non-negative integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs) = Signal c
forall a. Signal a
NullS
  | Bool
otherwise = if [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
produced_tokens Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
p then
                  [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
produced_tokens Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
forall a b c.
Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal a -> Signal b -> Signal c
zipWithSADF (Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> Signal ((Int, Int), Int, [a] -> [b] -> [c])
forall a. Signal a -> Signal a
tailS Signal ((Int, Int), Int, [a] -> [b] -> [c])
ct) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as) (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs)
                else
                  [Char] -> Signal c
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWithSADF: Function does not produce correct number of tokens"
  where ((Int
c1,Int
c2), Int
p, [a] -> [b] -> [c]
f) = Signal ((Int, Int), Int, [a] -> [b] -> [c])
-> ((Int, Int), Int, [a] -> [b] -> [c])
forall a. Signal a -> a
headS Signal ((Int, Int), Int, [a] -> [b] -> [c])
ct
        consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        produced_tokens :: [c]
produced_tokens = [a] -> [b] -> [c]
f [a]
consumed_tokens_as [b]
consumed_tokens_bs


-- | The process constructor 'zipWith3SADF' takes a signal of scenarios
-- (tuples with the consumed and produced tokens as well as a function operating
-- on lists), and results in an SADF-process that takes three input signals and
-- results in an output signal
zipWith3SADF :: Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
             -> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF :: Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
NullS Signal a
_ Signal b
_ Signal c
_ = Signal d
forall a. Signal a
NullS
zipWith3SADF Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
ct Signal a
as Signal b
bs Signal c
cs
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c3 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0
    = [Char] -> Signal d
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWith3SADF: Number of consumed tokens must be a non-negative integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c3 Signal c
cs) = Signal d
forall a. Signal a
NullS
  | Bool
otherwise = if [d] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [d]
produced_tokens Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
p then
                  [d] -> Signal d
forall a. [a] -> Signal a
signal [d]
produced_tokens Signal d -> Signal d -> Signal d
forall a. Signal a -> Signal a -> Signal a
+-+ Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
forall a b c d.
Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal a -> Signal b -> Signal c -> Signal d
zipWith3SADF (Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
forall a. Signal a -> Signal a
tailS Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
ct) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as)
                                                        (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs) (Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
dropS Int
c3 Signal c
cs)
                else
                  [Char] -> Signal d
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWith3SADF: Function does not produce correct number of tokens"
  where ((Int
c1, Int
c2, Int
c3), Int
p, [a] -> [b] -> [c] -> [d]
f) = Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
-> ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
forall a. Signal a -> a
headS Signal ((Int, Int, Int), Int, [a] -> [b] -> [c] -> [d])
ct
        consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        consumed_tokens_cs :: [c]
consumed_tokens_cs = Signal c -> [c]
forall a. Signal a -> [a]
fromSignal (Signal c -> [c]) -> Signal c -> [c]
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
takeS Int
c3 Signal c
cs
        produced_tokens :: [d]
produced_tokens = [a] -> [b] -> [c] -> [d]
f [a]
consumed_tokens_as [b]
consumed_tokens_bs [c]
consumed_tokens_cs


-- | The process constructor 'zipWith4SADF' takes a signal of scenarios
-- (tuples with the consumed and produced tokens as well as a function operating
-- on lists), and results in an SADF-process that takes four input signals and
-- results in an output signal
zipWith4SADF :: Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF :: Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
NullS Signal a
_ Signal b
_ Signal c
_ Signal d
_ = Signal e
forall a. Signal a
NullS
zipWith4SADF Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c3 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c4 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0
    = [Char] -> Signal e
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWith4SADF: Number of consumed tokens must be a non-negative integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c3 Signal c
cs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c4 Signal d
ds) = Signal e
forall a. Signal a
NullS
  | Bool
otherwise = if [e] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [e]
produced_tokens Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
p then
                  [e] -> Signal e
forall a. [a] -> Signal a
signal [e]
produced_tokens Signal e -> Signal e -> Signal e
forall a. Signal a -> Signal a -> Signal a
+-+ Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
forall a b c d e.
Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal a -> Signal b -> Signal c -> Signal d -> Signal e
zipWith4SADF (Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> Signal
     ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
forall a. Signal a -> Signal a
tailS Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
ct) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as)
                                              (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs) (Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
dropS Int
c3 Signal c
cs) (Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
dropS Int
c4 Signal d
ds)
                else
                  [Char] -> Signal e
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWith4SADF: Function does not produce correct number of tokens"
  where ((Int
c1, Int
c2, Int
c3, Int
c4), Int
p, [a] -> [b] -> [c] -> [d] -> [e]
f) = Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
-> ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
forall a. Signal a -> a
headS Signal ((Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e])
ct
        consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        consumed_tokens_cs :: [c]
consumed_tokens_cs = Signal c -> [c]
forall a. Signal a -> [a]
fromSignal (Signal c -> [c]) -> Signal c -> [c]
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
takeS Int
c3 Signal c
cs
        consumed_tokens_ds :: [d]
consumed_tokens_ds = Signal d -> [d]
forall a. Signal a -> [a]
fromSignal (Signal d -> [d]) -> Signal d -> [d]
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
takeS Int
c4 Signal d
ds
        produced_tokens :: [e]
produced_tokens = [a] -> [b] -> [c] -> [d] -> [e]
f [a]
consumed_tokens_as [b]
consumed_tokens_bs
                            [c]
consumed_tokens_cs [d]
consumed_tokens_ds


-- | The process constructor 'zipWith5SADF' takes a signal of scenarios
-- (tuples with the consumed and produced tokens as well as a function operating
-- on lists), and results in an SADF-process that takes five input signals and
-- results in an output signal
zipWith5SADF :: Signal ((Int, Int, Int, Int, Int), Int, [a] -> [b] -> [c] -> [d] -> [e] -> [f])
             -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal f
zipWith5SADF :: Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
NullS Signal a
_ Signal b
_ Signal c
_ Signal d
_ Signal e
_ = Signal f
forall a. Signal a
NullS
zipWith5SADF Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
ct Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c3 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c4 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
c5 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0
    = [Char] -> Signal f
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWith5SADF: Number of consumed tokens must be a non-negative integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c3 Signal c
cs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c4 Signal d
ds)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal e -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c5 Signal e
es) = Signal f
forall a. Signal a
NullS
  | Bool
otherwise = if [f] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [f]
produced_tokens Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
p then
                  [f] -> Signal f
forall a. [a] -> Signal a
signal [f]
produced_tokens Signal f -> Signal f -> Signal f
forall a. Signal a -> Signal a -> Signal a
+-+ Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
forall a b c d e f.
Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal f
zipWith5SADF (Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> Signal
     ((Int, Int, Int, Int, Int), Int,
      [a] -> [b] -> [c] -> [d] -> [e] -> [f])
forall a. Signal a -> Signal a
tailS Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
ct) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as)
                                              (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs) (Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
dropS Int
c3 Signal c
cs) (Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
dropS Int
c4 Signal d
ds) (Int -> Signal e -> Signal e
forall a. Int -> Signal a -> Signal a
dropS Int
c5 Signal e
es)
                else
                  [Char] -> Signal f
forall a. HasCallStack => [Char] -> a
error [Char]
"zipWith5SADF: Function does not produce correct number of tokens"
  where ((Int
c1, Int
c2, Int
c3, Int
c4, Int
c5), Int
p, [a] -> [b] -> [c] -> [d] -> [e] -> [f]
f) = Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
-> ((Int, Int, Int, Int, Int), Int,
    [a] -> [b] -> [c] -> [d] -> [e] -> [f])
forall a. Signal a -> a
headS Signal
  ((Int, Int, Int, Int, Int), Int,
   [a] -> [b] -> [c] -> [d] -> [e] -> [f])
ct
        consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        consumed_tokens_cs :: [c]
consumed_tokens_cs = Signal c -> [c]
forall a. Signal a -> [a]
fromSignal (Signal c -> [c]) -> Signal c -> [c]
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
takeS Int
c3 Signal c
cs
        consumed_tokens_ds :: [d]
consumed_tokens_ds = Signal d -> [d]
forall a. Signal a -> [a]
fromSignal (Signal d -> [d]) -> Signal d -> [d]
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
takeS Int
c4 Signal d
ds
        consumed_tokens_es :: [e]
consumed_tokens_es = Signal e -> [e]
forall a. Signal a -> [a]
fromSignal (Signal e -> [e]) -> Signal e -> [e]
forall a b. (a -> b) -> a -> b
$ Int -> Signal e -> Signal e
forall a. Int -> Signal a -> Signal a
takeS Int
c5 Signal e
es
        produced_tokens :: [f]
produced_tokens = [a] -> [b] -> [c] -> [d] -> [e] -> [f]
f [a]
consumed_tokens_as [b]
consumed_tokens_bs
                            [c]
consumed_tokens_cs [d]
consumed_tokens_ds [e]
consumed_tokens_es


------------------------------------------------------------------------
-- unzipSADF Processes (not exported)
------------------------------------------------------------------------

unzipSADF :: [(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF :: [(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF [] Signal ([a], [b])
_ = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS)
unzipSADF [(Int, Int)]
_ Signal ([a], [b])
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS)
unzipSADF ((Int
p1, Int
p2) : [(Int, Int)]
ps) (([a]
s1, [b]
s2) :- Signal ([a], [b])
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
s1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1 Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
s2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2 = [Char] -> (Signal a, Signal b)
forall a. HasCallStack => [Char] -> a
error [Char]
"unzipSADF: Process does not produce correct number of tokens"
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
s1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
sr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
s2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
sr2)
  where (Signal a
sr1, Signal b
sr2) = [(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
forall a b.
[(Int, Int)] -> Signal ([a], [b]) -> (Signal a, Signal b)
unzipSADF [(Int, Int)]
ps Signal ([a], [b])
ss


unzip3SADF :: [(Int, Int, Int)] -> Signal ([a], [b], [c])
           -> (Signal a, Signal b, Signal c)
unzip3SADF :: [(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF [] Signal ([a], [b], [c])
_ = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS)
unzip3SADF [(Int, Int, Int)]
_ Signal ([a], [b], [c])
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS)
unzip3SADF ((Int
p1, Int
p2, Int
p3) : [(Int, Int, Int)]
ps) (([a]
s1, [b]
s2, [c]
s3) :- Signal ([a], [b], [c])
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
s1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1 Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
s2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2
    Bool -> Bool -> Bool
|| [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
s3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p3 = [Char] -> (Signal a, Signal b, Signal c)
forall a. HasCallStack => [Char] -> a
error [Char]
"unzip3SADF: Process does not produce correct number of tokens"
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
s1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
sr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
s2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
sr2, [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
s3 Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal c
sr3)
  where (Signal a
sr1, Signal b
sr2, Signal c
sr3) = [(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
forall a b c.
[(Int, Int, Int)]
-> Signal ([a], [b], [c]) -> (Signal a, Signal b, Signal c)
unzip3SADF [(Int, Int, Int)]
ps Signal ([a], [b], [c])
ss


unzip4SADF :: [(Int, Int, Int, Int)] -> Signal ([a], [b], [c], [d])
           -> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF :: [(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF [] Signal ([a], [b], [c], [d])
_ = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS, Signal d
forall a. Signal a
NullS)
unzip4SADF [(Int, Int, Int, Int)]
_ Signal ([a], [b], [c], [d])
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS, Signal d
forall a. Signal a
NullS)
unzip4SADF ((Int
p1, Int
p2, Int
p3, Int
p4) : [(Int, Int, Int, Int)]
ps) (([a]
s1, [b]
s2, [c]
s3, [d]
s4) :- Signal ([a], [b], [c], [d])
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
s1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1 Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
s2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2
    Bool -> Bool -> Bool
|| [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
s3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p3 Bool -> Bool -> Bool
|| [d] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [d]
s4 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p4 = [Char] -> (Signal a, Signal b, Signal c, Signal d)
forall a. HasCallStack => [Char] -> a
error [Char]
"unzip4SADF: Process does not produce correct number of tokens"
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
s1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
sr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
s2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
sr2, [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
s3 Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal c
sr3, [d] -> Signal d
forall a. [a] -> Signal a
signal [d]
s4 Signal d -> Signal d -> Signal d
forall a. Signal a -> Signal a -> Signal a
+-+ Signal d
sr4)
  where (Signal a
sr1, Signal b
sr2, Signal c
sr3, Signal d
sr4) = [(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
forall a b c d.
[(Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d])
-> (Signal a, Signal b, Signal c, Signal d)
unzip4SADF [(Int, Int, Int, Int)]
ps Signal ([a], [b], [c], [d])
ss


unzip5SADF :: [(Int, Int, Int, Int, Int)] -> Signal ([a], [b], [c], [d], [e])
           -> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF :: [(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF [] Signal ([a], [b], [c], [d], [e])
_ = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS, Signal d
forall a. Signal a
NullS, Signal e
forall a. Signal a
NullS)
unzip5SADF [(Int, Int, Int, Int, Int)]
_ Signal ([a], [b], [c], [d], [e])
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS, Signal d
forall a. Signal a
NullS, Signal e
forall a. Signal a
NullS)
unzip5SADF ((Int
p1, Int
p2, Int
p3, Int
p4, Int
p5) : [(Int, Int, Int, Int, Int)]
ps) (([a]
s1, [b]
s2, [c]
s3, [d]
s4, [e]
s5) :- Signal ([a], [b], [c], [d], [e])
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
s1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1 Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
s2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2
    Bool -> Bool -> Bool
|| [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
s3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p3 Bool -> Bool -> Bool
|| [d] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [d]
s4 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p4
    Bool -> Bool -> Bool
|| [e] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [e]
s5 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p5 = [Char] -> (Signal a, Signal b, Signal c, Signal d, Signal e)
forall a. HasCallStack => [Char] -> a
error [Char]
"unzip5SADF: Process does not produce correct number of tokens"
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
s1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
sr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
s2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
sr2, [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
s3 Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal c
sr3,
                 [d] -> Signal d
forall a. [a] -> Signal a
signal [d]
s4 Signal d -> Signal d -> Signal d
forall a. Signal a -> Signal a -> Signal a
+-+ Signal d
sr4, [e] -> Signal e
forall a. [a] -> Signal a
signal [e]
s5 Signal e -> Signal e -> Signal e
forall a. Signal a -> Signal a -> Signal a
+-+ Signal e
sr5)
  where (Signal a
sr1, Signal b
sr2, Signal c
sr3, Signal d
sr4, Signal e
sr5) = [(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
forall a b c d e.
[(Int, Int, Int, Int, Int)]
-> Signal ([a], [b], [c], [d], [e])
-> (Signal a, Signal b, Signal c, Signal d, Signal e)
unzip5SADF [(Int, Int, Int, Int, Int)]
ps Signal ([a], [b], [c], [d], [e])
ss

------------------------------------------------------------------------
--
-- Helper functions (not exported!)
--
------------------------------------------------------------------------

sufficient_tokens :: (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens :: a -> Signal t -> Bool
sufficient_tokens a
0 Signal t
_     = Bool
True
sufficient_tokens a
_ Signal t
NullS = Bool
False
sufficient_tokens a
n (t
_:-Signal t
xs)
 = if a
n a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0 then
     [Char] -> Bool
forall a. HasCallStack => [Char] -> a
error [Char]
"sufficient_tokens: n must not be negative"
   else
     a -> Signal t -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) Signal t
xs


get_prodToken :: Signal (a,b,c) -> [b]
get_prodToken :: Signal (a, b, c) -> [b]
get_prodToken Signal (a, b, c)
NullS = []
get_prodToken ((a
_, b
x, c
_):-Signal (a, b, c)
xs) = b
x b -> [b] -> [b]
forall a. a -> [a] -> [a]
: Signal (a, b, c) -> [b]
forall a b c. Signal (a, b, c) -> [b]
get_prodToken Signal (a, b, c)
xs


inpOut1n :: Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n :: Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n Signal (it, ot, [a] -> y)
NullS = Signal (it, Int, [a] -> [y])
forall a. Signal a
NullS
inpOut1n ((it
it, ot
_, [a] -> y
f):-Signal (it, ot, [a] -> y)
xs) = (it
it, Int
1, \[a]
a -> [[a] -> y
f [a]
a]) (it, Int, [a] -> [y])
-> Signal (it, Int, [a] -> [y]) -> Signal (it, Int, [a] -> [y])
forall a. a -> Signal a -> Signal a
:- Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
forall it ot a y.
Signal (it, ot, [a] -> y) -> Signal (it, Int, [a] -> [y])
inpOut1n Signal (it, ot, [a] -> y)
xs

inpOut2n :: Signal (it, ot, [a] -> [b] -> y) -> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n :: Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n Signal (it, ot, [a] -> [b] -> y)
NullS = Signal (it, Int, [a] -> [b] -> [y])
forall a. Signal a
NullS
inpOut2n ((it
it, ot
_, [a] -> [b] -> y
f):-Signal (it, ot, [a] -> [b] -> y)
xs) = (it
it, Int
1, \[a]
a [b]
b -> [[a] -> [b] -> y
f [a]
a [b]
b]) (it, Int, [a] -> [b] -> [y])
-> Signal (it, Int, [a] -> [b] -> [y])
-> Signal (it, Int, [a] -> [b] -> [y])
forall a. a -> Signal a -> Signal a
:- Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
forall it ot a b y.
Signal (it, ot, [a] -> [b] -> y)
-> Signal (it, Int, [a] -> [b] -> [y])
inpOut2n Signal (it, ot, [a] -> [b] -> y)
xs

inpOut3n :: Signal (it, ot, [a] -> [b] -> [c] -> y)
         -> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n :: Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n Signal (it, ot, [a] -> [b] -> [c] -> y)
NullS = Signal (it, Int, [a] -> [b] -> [c] -> [y])
forall a. Signal a
NullS
inpOut3n ((it
it, ot
_, [a] -> [b] -> [c] -> y
f):-Signal (it, ot, [a] -> [b] -> [c] -> y)
xs) = (it
it, Int
1, \[a]
a [b]
b [c]
c -> [[a] -> [b] -> [c] -> y
f [a]
a [b]
b [c]
c]) (it, Int, [a] -> [b] -> [c] -> [y])
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
forall a. a -> Signal a -> Signal a
:- Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
forall it ot a b c y.
Signal (it, ot, [a] -> [b] -> [c] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [y])
inpOut3n Signal (it, ot, [a] -> [b] -> [c] -> y)
xs

inpOut4n :: Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
         -> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n :: Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
NullS = Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
forall a. Signal a
NullS
inpOut4n ((it
it, ot
_, [a] -> [b] -> [c] -> [d] -> y
f):-Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
xs) = (it
it, Int
1, \[a]
a [b]
b [c]
c [d]
d -> [[a] -> [b] -> [c] -> [d] -> y
f [a]
a [b]
b [c]
c [d]
d]) (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
forall a. a -> Signal a -> Signal a
:- Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
forall it ot a b c d y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [y])
inpOut4n Signal (it, ot, [a] -> [b] -> [c] -> [d] -> y)
xs

inpOut5n :: Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
         -> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n :: Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
NullS = Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
forall a. Signal a
NullS
inpOut5n ((it
it, ot
_, [a] -> [b] -> [c] -> [d] -> [e] -> y
f):-Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
xs) = (it
it, Int
1, \[a]
a [b]
b [c]
c [d]
d [e]
e -> [[a] -> [b] -> [c] -> [d] -> [e] -> y
f [a]
a [b]
b [c]
c [d]
d [e]
e]) (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
forall a. a -> Signal a -> Signal a
:- Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
forall it ot a b c d e y.
Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
-> Signal (it, Int, [a] -> [b] -> [c] -> [d] -> [e] -> [y])
inpOut5n Signal (it, ot, [a] -> [b] -> [c] -> [d] -> [e] -> y)
xs

---------------------------------------------------------
-- Helper functios to the detector's FSM  (not exported)
---------------------------------------------------------

nextStateFSM :: Int -> (s -> [a] -> s)
             -> Signal s -> Signal a -> Signal s
nextStateFSM :: Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
_ s -> [a] -> s
_ Signal s
NullS Signal a
_ = Signal s
forall a. Signal a
NullS
nextStateFSM Int
_ s -> [a] -> s
_ Signal s
_ Signal a
NullS = Signal s
forall a. Signal a
NullS
nextStateFSM Int
c s -> [a] -> s
f Signal s
ss Signal a
as
  | Int
c Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [Char] -> Signal s
forall a. HasCallStack => [Char] -> a
error [Char]
"nextStateFSM: Number of consumed tokens must be positive integer"
  | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c Signal a
as = Signal s
forall a. Signal a
NullS
  | Bool
otherwise = [s] -> Signal s
forall a. [a] -> Signal a
signal [s
next_state] Signal s -> Signal s -> Signal s
forall a. Signal a -> Signal a -> Signal a
+-+ Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
forall s a.
Int -> (s -> [a] -> s) -> Signal s -> Signal a -> Signal s
nextStateFSM Int
c s -> [a] -> s
f (Signal s -> Signal s
forall a. Signal a -> Signal a
tailS Signal s
ss) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c Signal a
as)
  where consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c Signal a
as
        current_state :: s
current_state = Signal s -> s
forall a. Signal a -> a
headS Signal s
ss
        next_state :: s
next_state = s -> [a] -> s
f s
current_state [a]
consumed_tokens_as


nextStateFSM2 :: (Int, Int) -> (s -> [a] -> [b] -> s)
              -> Signal s -> Signal a -> Signal b -> Signal s
nextStateFSM2 :: (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int, Int)
_ s -> [a] -> [b] -> s
_ Signal s
NullS Signal a
_ Signal b
_ = Signal s
forall a. Signal a
NullS
nextStateFSM2 (Int, Int)
_ s -> [a] -> [b] -> s
_ Signal s
_ Signal a
NullS Signal b
_ = Signal s
forall a. Signal a
NullS
nextStateFSM2 (Int, Int)
_ s -> [a] -> [b] -> s
_ Signal s
_ Signal a
_ Signal b
NullS = Signal s
forall a. Signal a
NullS
nextStateFSM2 (Int
c1, Int
c2) s -> [a] -> [b] -> s
f Signal s
ss Signal a
as Signal b
bs
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = [Char] -> Signal s
forall a. HasCallStack => [Char] -> a
error [Char]
"nextStateFSM2: Number of consumed tokens must be positive integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs) = Signal s
forall a. Signal a
NullS
  | Bool
otherwise = [s] -> Signal s
forall a. [a] -> Signal a
signal [s
next_state] Signal s -> Signal s -> Signal s
forall a. Signal a -> Signal a -> Signal a
+-+ (Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
forall s a b.
(Int, Int)
-> (s -> [a] -> [b] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal s
nextStateFSM2 (Int
c1, Int
c2) s -> [a] -> [b] -> s
f (Signal s -> Signal s
forall a. Signal a -> Signal a
tailS Signal s
ss) (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as) (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs)
  where consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        current_state :: s
current_state = Signal s -> s
forall a. Signal a -> a
headS Signal s
ss
        next_state :: s
next_state = s -> [a] -> [b] -> s
f s
current_state [a]
consumed_tokens_as [b]
consumed_tokens_bs


nextStateFSM3 :: (Int, Int, Int) -> (s -> [a] -> [b] -> [c] -> s)
              -> Signal s -> Signal a -> Signal b -> Signal c -> Signal s
nextStateFSM3 :: (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> s
_ Signal s
NullS Signal a
_ Signal b
_ Signal c
_ = Signal s
forall a. Signal a
NullS
nextStateFSM3 (Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> s
_ Signal s
_ Signal a
NullS Signal b
_ Signal c
_ = Signal s
forall a. Signal a
NullS
nextStateFSM3 (Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> s
_ Signal s
_ Signal a
_ Signal b
NullS Signal c
_ = Signal s
forall a. Signal a
NullS
nextStateFSM3 (Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> s
_ Signal s
_ Signal a
_ Signal b
_ Signal c
NullS = Signal s
forall a. Signal a
NullS
nextStateFSM3 (Int
c1, Int
c2, Int
c3) s -> [a] -> [b] -> [c] -> s
f Signal s
ss Signal a
as Signal b
bs Signal c
cs
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c3 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0
    = [Char] -> Signal s
forall a. HasCallStack => [Char] -> a
error [Char]
"nextStateFSM3: Number of consumed tokens must be positive integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c3 Signal c
cs) = Signal s
forall a. Signal a
NullS
  | Bool
otherwise = [s] -> Signal s
forall a. [a] -> Signal a
signal [s
next_state] Signal s -> Signal s -> Signal s
forall a. Signal a -> Signal a -> Signal a
+-+ (Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
forall s a b c.
(Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal s
nextStateFSM3 (Int
c1, Int
c2, Int
c3) s -> [a] -> [b] -> [c] -> s
f (Signal s -> Signal s
forall a. Signal a -> Signal a
tailS Signal s
ss)
                                        (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as) (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs) (Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
dropS Int
c3 Signal c
cs)
  where consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        consumed_tokens_cs :: [c]
consumed_tokens_cs = Signal c -> [c]
forall a. Signal a -> [a]
fromSignal (Signal c -> [c]) -> Signal c -> [c]
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
takeS Int
c3 Signal c
cs
        current_state :: s
current_state = Signal s -> s
forall a. Signal a -> a
headS Signal s
ss
        next_state :: s
next_state = s -> [a] -> [b] -> [c] -> s
f s
current_state [a]
consumed_tokens_as
                       [b]
consumed_tokens_bs [c]
consumed_tokens_cs


nextStateFSM4 :: (Int, Int, Int, Int) -> (s -> [a] -> [b] -> [c] -> [d] -> s)
              -> Signal s -> Signal a -> Signal b -> Signal c -> Signal d -> Signal s
nextStateFSM4 :: (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> s
_ Signal s
NullS Signal a
_ Signal b
_ Signal c
_ Signal d
_ = Signal s
forall a. Signal a
NullS
nextStateFSM4 (Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> s
_ Signal s
_ Signal a
NullS Signal b
_ Signal c
_ Signal d
_ = Signal s
forall a. Signal a
NullS
nextStateFSM4 (Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> s
_ Signal s
_ Signal a
_ Signal b
NullS Signal c
_ Signal d
_ = Signal s
forall a. Signal a
NullS
nextStateFSM4 (Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> s
_ Signal s
_ Signal a
_ Signal b
_ Signal c
NullS Signal d
_ = Signal s
forall a. Signal a
NullS
nextStateFSM4 (Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> s
_ Signal s
_ Signal a
_ Signal b
_ Signal c
_ Signal d
NullS = Signal s
forall a. Signal a
NullS
nextStateFSM4 (Int
c1, Int
c2, Int
c3, Int
c4) s -> [a] -> [b] -> [c] -> [d] -> s
f Signal s
ss Signal a
as Signal b
bs Signal c
cs Signal d
ds
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c3 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c4 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0
    = [Char] -> Signal s
forall a. HasCallStack => [Char] -> a
error [Char]
"nextStateFSM4: Number of consumed tokens must be positive integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c3 Signal c
cs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c4 Signal d
ds) = Signal s
forall a. Signal a
NullS
  | Bool
otherwise = [s] -> Signal s
forall a. [a] -> Signal a
signal [s
next_state] Signal s -> Signal s -> Signal s
forall a. Signal a -> Signal a -> Signal a
+-+ (Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
forall s a b c d.
(Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal s
nextStateFSM4 (Int
c1, Int
c2, Int
c3, Int
c4) s -> [a] -> [b] -> [c] -> [d] -> s
f (Signal s -> Signal s
forall a. Signal a -> Signal a
tailS Signal s
ss)
                                        (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as) (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs) (Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
dropS Int
c3 Signal c
cs) (Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
dropS Int
c4 Signal d
ds)
  where consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        consumed_tokens_cs :: [c]
consumed_tokens_cs = Signal c -> [c]
forall a. Signal a -> [a]
fromSignal (Signal c -> [c]) -> Signal c -> [c]
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
takeS Int
c3 Signal c
cs
        consumed_tokens_ds :: [d]
consumed_tokens_ds = Signal d -> [d]
forall a. Signal a -> [a]
fromSignal (Signal d -> [d]) -> Signal d -> [d]
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
takeS Int
c4 Signal d
ds
        current_state :: s
current_state = Signal s -> s
forall a. Signal a -> a
headS Signal s
ss
        next_state :: s
next_state = s -> [a] -> [b] -> [c] -> [d] -> s
f s
current_state [a]
consumed_tokens_as
                       [b]
consumed_tokens_bs [c]
consumed_tokens_cs [d]
consumed_tokens_ds


nextStateFSM5 :: (Int, Int, Int, Int, Int) -> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
              -> Signal s -> Signal a -> Signal b -> Signal c -> Signal d -> Signal e -> Signal s
nextStateFSM5 :: (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int, Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
_ Signal s
NullS Signal a
_ Signal b
_ Signal c
_ Signal d
_ Signal e
_ = Signal s
forall a. Signal a
NullS
nextStateFSM5 (Int, Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
_ Signal s
_ Signal a
NullS Signal b
_ Signal c
_ Signal d
_ Signal e
_ = Signal s
forall a. Signal a
NullS
nextStateFSM5 (Int, Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
_ Signal s
_ Signal a
_ Signal b
NullS Signal c
_ Signal d
_ Signal e
_ = Signal s
forall a. Signal a
NullS
nextStateFSM5 (Int, Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
_ Signal s
_ Signal a
_ Signal b
_ Signal c
NullS Signal d
_ Signal e
_ = Signal s
forall a. Signal a
NullS
nextStateFSM5 (Int, Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
_ Signal s
_ Signal a
_ Signal b
_ Signal c
_ Signal d
NullS Signal e
_ = Signal s
forall a. Signal a
NullS
nextStateFSM5 (Int, Int, Int, Int, Int)
_ s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
_ Signal s
_ Signal a
_ Signal b
_ Signal c
_ Signal d
_ Signal e
NullS = Signal s
forall a. Signal a
NullS
nextStateFSM5 (Int
c1, Int
c2, Int
c3, Int
c4, Int
c5) s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f Signal s
ss Signal a
as Signal b
bs Signal c
cs Signal d
ds Signal e
es
  | Int
c1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c3 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c4 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 Bool -> Bool -> Bool
|| Int
c5 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0
    = [Char] -> Signal s
forall a. HasCallStack => [Char] -> a
error [Char]
"nextStateFSM4: Number of consumed tokens must be positive integer"
  | (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c1 Signal a
as)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c2 Signal b
bs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c3 Signal c
cs)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c4 Signal d
ds)
    Bool -> Bool -> Bool
|| (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Int -> Signal e -> Bool
forall a t. (Num a, Eq a, Ord a) => a -> Signal t -> Bool
sufficient_tokens Int
c5 Signal e
es) = Signal s
forall a. Signal a
NullS
  | Bool
otherwise = [s] -> Signal s
forall a. [a] -> Signal a
signal [s
next_state] Signal s -> Signal s -> Signal s
forall a. Signal a -> Signal a -> Signal a
+-+ (Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
forall s a b c d e.
(Int, Int, Int, Int, Int)
-> (s -> [a] -> [b] -> [c] -> [d] -> [e] -> s)
-> Signal s
-> Signal a
-> Signal b
-> Signal c
-> Signal d
-> Signal e
-> Signal s
nextStateFSM5 (Int
c1, Int
c2, Int
c3, Int
c4, Int
c5) s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f (Signal s -> Signal s
forall a. Signal a -> Signal a
tailS Signal s
ss)
                                        (Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
dropS Int
c1 Signal a
as) (Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
dropS Int
c2 Signal b
bs) (Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
dropS Int
c3 Signal c
cs)
                                        (Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
dropS Int
c4 Signal d
ds) (Int -> Signal e -> Signal e
forall a. Int -> Signal a -> Signal a
dropS Int
c5 Signal e
es)
  where consumed_tokens_as :: [a]
consumed_tokens_as = Signal a -> [a]
forall a. Signal a -> [a]
fromSignal (Signal a -> [a]) -> Signal a -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> Signal a -> Signal a
forall a. Int -> Signal a -> Signal a
takeS Int
c1 Signal a
as
        consumed_tokens_bs :: [b]
consumed_tokens_bs = Signal b -> [b]
forall a. Signal a -> [a]
fromSignal (Signal b -> [b]) -> Signal b -> [b]
forall a b. (a -> b) -> a -> b
$ Int -> Signal b -> Signal b
forall a. Int -> Signal a -> Signal a
takeS Int
c2 Signal b
bs
        consumed_tokens_cs :: [c]
consumed_tokens_cs = Signal c -> [c]
forall a. Signal a -> [a]
fromSignal (Signal c -> [c]) -> Signal c -> [c]
forall a b. (a -> b) -> a -> b
$ Int -> Signal c -> Signal c
forall a. Int -> Signal a -> Signal a
takeS Int
c3 Signal c
cs
        consumed_tokens_ds :: [d]
consumed_tokens_ds = Signal d -> [d]
forall a. Signal a -> [a]
fromSignal (Signal d -> [d]) -> Signal d -> [d]
forall a b. (a -> b) -> a -> b
$ Int -> Signal d -> Signal d
forall a. Int -> Signal a -> Signal a
takeS Int
c4 Signal d
ds
        consumed_tokens_es :: [e]
consumed_tokens_es = Signal e -> [e]
forall a. Signal a -> [a]
fromSignal (Signal e -> [e]) -> Signal e -> [e]
forall a b. (a -> b) -> a -> b
$ Int -> Signal e -> Signal e
forall a. Int -> Signal a -> Signal a
takeS Int
c5 Signal e
es
        current_state :: s
current_state = Signal s -> s
forall a. Signal a -> a
headS Signal s
ss
        next_state :: s
next_state = s -> [a] -> [b] -> [c] -> [d] -> [e] -> s
f s
current_state [a]
consumed_tokens_as
                       [b]
consumed_tokens_bs [c]
consumed_tokens_cs
                       [d]
consumed_tokens_ds [e]
consumed_tokens_es


outputFSM :: (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM :: (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [a])
_ Signal s
NullS = Signal a
forall a. Signal a
NullS
outputFSM s -> (Int, [a])
g (s
s:-Signal s
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
y1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p = [Char] -> Signal a
forall a. HasCallStack => [Char] -> a
error [Char]
"outputFSM: Incorrect number of produced tokens."
  | Bool
otherwise = [a] -> Signal a
forall a. [a] -> Signal a
signal [a]
y1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ (s -> (Int, [a])) -> Signal s -> Signal a
forall s a. (s -> (Int, [a])) -> Signal s -> Signal a
outputFSM s -> (Int, [a])
g Signal s
ss
  where (Int
p, [a]
y1) = s -> (Int, [a])
g s
s


outputFSM2 :: (s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 :: (s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([a], [b]))
_ Signal s
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS)
outputFSM2 s -> ((Int, Int), ([a], [b]))
g (s
s:-Signal s
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
y1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1 Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
y2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2 = [Char] -> (Signal a, Signal b)
forall a. HasCallStack => [Char] -> a
error [Char]
"outputFSM2: Incorrect number of produced tokens."
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
y1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
yr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
y2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
yr2)
  where ((Int
p1, Int
p2), ([a]
y1, [b]
y2)) = s -> ((Int, Int), ([a], [b]))
g s
s
        (Signal a
yr1, Signal b
yr2) = (s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
forall s a b.
(s -> ((Int, Int), ([a], [b]))) -> Signal s -> (Signal a, Signal b)
outputFSM2 s -> ((Int, Int), ([a], [b]))
g Signal s
ss


outputFSM3 :: (s -> ((Int, Int, Int), ([a], [b], [c])))
           -> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 :: (s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([a], [b], [c]))
_ Signal s
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS)
outputFSM3 s -> ((Int, Int, Int), ([a], [b], [c]))
g (s
s:-Signal s
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
y1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1
    Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
y2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2
    Bool -> Bool -> Bool
|| [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
y3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p3 = [Char] -> (Signal a, Signal b, Signal c)
forall a. HasCallStack => [Char] -> a
error [Char]
"outputFSM3: Incorrect number of produced tokens."
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
y1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
yr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
y2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
yr2, [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
y3 Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal c
yr3)
  where ((Int
p1, Int
p2, Int
p3), ([a]
y1, [b]
y2, [c]
y3)) = s -> ((Int, Int, Int), ([a], [b], [c]))
g s
s
        (Signal a
yr1, Signal b
yr2, Signal c
yr3) = (s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
forall s a b c.
(s -> ((Int, Int, Int), ([a], [b], [c])))
-> Signal s -> (Signal a, Signal b, Signal c)
outputFSM3 s -> ((Int, Int, Int), ([a], [b], [c]))
g Signal s
ss


outputFSM4 :: (s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
           -> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 :: (s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([a], [b], [c], [d]))
_ Signal s
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS, Signal d
forall a. Signal a
NullS)
outputFSM4 s -> ((Int, Int, Int, Int), ([a], [b], [c], [d]))
g (s
s:-Signal s
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
y1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1
    Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
y2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2
    Bool -> Bool -> Bool
|| [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
y3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p3
    Bool -> Bool -> Bool
|| [d] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [d]
y4 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p4 = [Char] -> (Signal a, Signal b, Signal c, Signal d)
forall a. HasCallStack => [Char] -> a
error [Char]
"outputFSM4: Incorrect number of produced tokens."
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
y1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
yr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
y2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
yr2, [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
y3 Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal c
yr3, [d] -> Signal d
forall a. [a] -> Signal a
signal [d]
y4 Signal d -> Signal d -> Signal d
forall a. Signal a -> Signal a -> Signal a
+-+ Signal d
yr4)
  where ((Int
p1, Int
p2, Int
p3, Int
p4), ([a]
y1, [b]
y2, [c]
y3, [d]
y4)) = s -> ((Int, Int, Int, Int), ([a], [b], [c], [d]))
g s
s
        (Signal a
yr1, Signal b
yr2, Signal c
yr3, Signal d
yr4) = (s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
forall s a b c d.
(s -> ((Int, Int, Int, Int), ([a], [b], [c], [d])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d)
outputFSM4 s -> ((Int, Int, Int, Int), ([a], [b], [c], [d]))
g Signal s
ss


outputFSM5 :: (s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
           -> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 :: (s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e]))
_ Signal s
NullS = (Signal a
forall a. Signal a
NullS, Signal b
forall a. Signal a
NullS, Signal c
forall a. Signal a
NullS, Signal d
forall a. Signal a
NullS, Signal e
forall a. Signal a
NullS)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e]))
g (s
s:-Signal s
ss)
  | [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
y1 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p1
    Bool -> Bool -> Bool
|| [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
y2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p2 Bool -> Bool -> Bool
|| [c] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [c]
y3 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p3
    Bool -> Bool -> Bool
|| [d] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [d]
y4 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p4 Bool -> Bool -> Bool
|| [e] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [e]
y5 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Int
p5 = [Char] -> (Signal a, Signal b, Signal c, Signal d, Signal e)
forall a. HasCallStack => [Char] -> a
error [Char]
"outputFSM5: Incorrect number of produced tokens."
  | Bool
otherwise = ([a] -> Signal a
forall a. [a] -> Signal a
signal [a]
y1 Signal a -> Signal a -> Signal a
forall a. Signal a -> Signal a -> Signal a
+-+ Signal a
yr1, [b] -> Signal b
forall a. [a] -> Signal a
signal [b]
y2 Signal b -> Signal b -> Signal b
forall a. Signal a -> Signal a -> Signal a
+-+ Signal b
yr2, [c] -> Signal c
forall a. [a] -> Signal a
signal [c]
y3 Signal c -> Signal c -> Signal c
forall a. Signal a -> Signal a -> Signal a
+-+ Signal c
yr3,
                 [d] -> Signal d
forall a. [a] -> Signal a
signal [d]
y4 Signal d -> Signal d -> Signal d
forall a. Signal a -> Signal a -> Signal a
+-+ Signal d
yr4, [e] -> Signal e
forall a. [a] -> Signal a
signal [e]
y5 Signal e -> Signal e -> Signal e
forall a. Signal a -> Signal a -> Signal a
+-+ Signal e
yr5)
  where ((Int
p1, Int
p2, Int
p3, Int
p4, Int
p5),([a]
y1, [b]
y2, [c]
y3, [d]
y4, [e]
y5)) = s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e]))
g s
s
        (Signal a
yr1, Signal b
yr2, Signal c
yr3, Signal d
yr4, Signal e
yr5) = (s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
forall s a b c d e.
(s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e])))
-> Signal s -> (Signal a, Signal b, Signal c, Signal d, Signal e)
outputFSM5 s -> ((Int, Int, Int, Int, Int), ([a], [b], [c], [d], [e]))
g Signal s
ss


------------------------------------------------------------------------
--
-- Test of Library (not exported)
--
------------------------------------------------------------------------

{-

---------------------------------------------------------
-- test1: kernel22SADF test
---------------------------------------------------------

test1 :: Signal ((Int, Int), (Int, Int), [a] -> [b] -> ([c], [d]))
      -> Signal a -> Signal b -> (Signal c, Signal d)
test1 = kernel22SADF

ct = signal [((1,1), (1,1), \[a] [b] -> ([2*a], [2*b])),
             ((2,2), (1,1), \[a,b] [c,d] -> ([a+b], [c+d])),
             ((1,2), (2,1), \[a] [b,c] -> ([b,c], [a]))]

x = signal [1..20]
y = signal [21 .. 40]

test1out = test1 ct x y

---------------------------------------------------------
-- test2: Anti Wind-up system
---------------------------------------------------------

-- State transition function for the detector
f :: (Num a, Ord a) => Int -> [a] -> [a] -> Int
f 1 [y] [v] = if (y > 100 && v > 0 || y < (-100) && v < 0) then 2 else 1
f 2 [y] [v] = if (y > 100 && v > 0 || y < (-100) && v < 0) then 2 else 1

-- Output function for the detector
g :: Num a => Int -> ((Int, Int), ([((Int, Int), Int, [a] -> [a] -> [a])], [(Int, Int, [a] -> [a])]))
g 1 = ((1,1), ([((1,1), 1, \[a] [b] -> [a+b])], [(1, 1, \[a] -> [a])]))
g 2 = ((1,1), ([((0,1), 1, \_ [b] -> [b])], [(1, 0, \[a] -> [])]))

-- Detector
detector :: (Num a, Ord a) => Signal a -> Signal a
         -> (Signal ((Int, Int), Int, [a] -> [a] -> [a]), Signal (Int, Int, [a] -> [a]))
detector = detector22SADF (1,1) f g 1

syst :: (Num a, Ord a) => Signal a -> Signal a
syst input = output
  where output = integrator c1 s1 s3
        s3 = delaySADF [0] output
        s1 = kernel11SADF c2 input
        (c1, c2) = detector s3 input
        integrator = kernel21SADF


---------------------------------------------------------
-- test3: Register Bank (3 registers)
---------------------------------------------------------

-- Scenarios list
scenarios :: Int -> ((Int, Int, Int, Int), (Int, Int, Int, Int),
             [a] -> [a] -> [a] -> [a] -> ([a], [a], [a], [a]))
scenarios 0 = ((0,0,0,0), (0,0,0,0), \_ _ _ _ -> ([], [], [], []))
scenarios 1 = ((0,1,0,0), (1,1,0,0), \_ [r1] _ _ -> ([r1], [r1], [], []))
scenarios 2 = ((0,0,1,0), (1,0,1,0), \_ _ [r2] _ -> ([r2], [], [r2], []))
scenarios 3 = ((0,0,0,1), (1,0,0,1), \_ _ _ [r3] -> ([r3], [], [], [r3]))
scenarios 4 = ((1,1,0,0), (0,1,0,0), \[r1] _ _ _ -> ([], [r1], [], []))
scenarios 5 = ((1,0,1,0), (0,0,1,0), \[r2] _ _ _ -> ([], [], [r2], []))
scenarios 6 = ((1,0,0,1), (0,0,0,1), \[r3] _ _ _ -> ([], [], [], [r3]))
scenarios _ = error "scenarios: outside the state list"

switchState :: Int -> [String] -> Int
switchState _ ["sc0"] = 0     -- No operation (kernel inactive)
switchState _ ["lr1"] = 1     -- Load r1
switchState _ ["lr2"] = 2     -- Load r2
switchState _ ["lr3"] = 3     -- Load r3
switchState _ ["sr1"] = 4     -- Store r1
switchState _ ["sr2"] = 5     -- Store r2
switchState _ ["sr3"] = 6     -- Store r3
switchState _ _ = error "switchState: Input not recognized"

regDetector = detector11SADF 1 switchState (\e -> (1, [scenarios e])) 0
regKernel = kernel44SADF

registerBank inputControl inputData = output
  where ct = regDetector inputControl
        (output, r1, r2, r3) = regKernel ct inputData r1' r2' r3'
        r1' = delaySADF [0] r1
        r2' = delaySADF [0] r2
        r3' = delaySADF [0] r3

cInput = signal ["lr1","lr2","lr3","sr1","sr2","sr3","sc0","lr1","lr2","lr3","lr1","lr2","lr3"]
dInput = signal [1..10]

regOutput = registerBank cInput dInput
-- Expected output {0,0,0,1,2,3,1,2,3}

-}