content: {-# LANGUAGE Arrows #-}
  {-# LANGUAGE RecordWildCards #-}
  
  module Feedback where
  
  -- essence-of-live-coding
  import Util
  
  -- test-framework
  import Test.Framework
  
  -- test-framework-quickcheck2
  import Test.Framework.Providers.QuickCheck2
  
  -- QuickCheck
  import Test.QuickCheck
  
  -- essence-of-live-coding
  import LiveCoding
  
  constCell :: (Monad m) => Int -> Cell m () Int
  constCell cellState =
    Cell
      { cellStep = \state _ -> return (state, state)
      , ..
      }
  
  test =
    testGroup
      "Feedback"
      [ testProperty
          "Migrates into feedback"
          CellMigrationSimulation
            { cell1 = constCell 23
            , cell2 = feedback [] $ proc ((), ns) -> do
                n <- constCell 42 -< ()
                returnA -< (sum ns, n : ns)
            , input1 = replicate 3 ()
            , input2 = replicate 3 ()
            , output1 = [23, 23, 23]
            , output2 = [0, 23, 46]
            }
      , testProperty
          "Migrates out of feedback"
          CellMigrationSimulation
            { cell1 = feedback [] $ proc ((), ns) -> do
                n <- constCell 23 -< ()
                returnA -< (sum ns, n : ns)
            , cell2 = constCell 42
            , input1 = replicate 3 ()
            , input2 = replicate 3 ()
            , output1 = [0, 23, 46]
            , output2 = [23, 23, 23]
            }
      ]
  