diff options
Diffstat (limited to 'test/AggregateSpec.hs')
| -rw-r--r-- | test/AggregateSpec.hs | 78 |
1 files changed, 31 insertions, 47 deletions
diff --git a/test/AggregateSpec.hs b/test/AggregateSpec.hs index 71bf420..ae22560 100644 --- a/test/AggregateSpec.hs +++ b/test/AggregateSpec.hs @@ -4,66 +4,59 @@ import Control.Arrow import Control.Concurrent (threadDelay) import Control.Monad (forM_) import Control.Monad.Trans (MonadIO, liftIO) -import Data.List (intercalate) +import Data.List (intersperse) import Data.Sensor qualified as S import Test.Hspec +import Text.Printf spec :: SpecWith () spec = do describe "current time" do it "date" do - S.runSensorT (S.sample 1 date) >>= (`shouldBe` ["1970-01-01"]) + S.sample 1 date >>= (`shouldBe` ["1970-01-01"]) it "time" do - S.runSensorT (S.sample 1 time) >>= (`shouldBe` ["00:00:00"]) + S.sample 1 time >>= (`shouldBe` ["00:00:00"]) it "date and time" do - S.runSensorT (S.sample 1 (intercalate " " <$> sequence [date, time])) - >>= (`shouldBe` ["1970-01-01 00:00:00"]) + S.sample 1 (S.concatS (intersperse (pure " ") [date, time])) + >>= (`shouldBe` [["1970-01-01", " ", "00:00:00"]]) describe "timing" do it "fast, fast" do - S.runSensorT (S.sample 2 ((,) <$> count <*> count)) + S.sample 2 ((,) <$> count <*> count) >>= (`shouldBe` [(1, 1), (2, 2)]) it "fast, slow" do - S.runSensorT (S.sample 4 ((,) <$> count <*> slowCount)) + S.sample 4 ((,) <$> count <*> slowCount) >>= (`shouldBe` [(1, 1), (2, 1), (2, 2), (3, 2)]) - S.runSensorT (S.sample 3 (const <$> count <*> slowCount)) + S.sample 3 (const <$> count <*> slowCount) >>= (`shouldBe` [1, 2, 2]) - S.runSensorT (S.sample 3 (flip const <$> count <*> slowCount)) + S.sample 3 (flip const <$> count <*> slowCount) >>= (`shouldBe` [1, 1, 2]) describe "square count" do it "count" do - S.runSensorT (S.sample 2 count) >>= (`shouldBe` [1, 2]) + S.sample 2 count >>= (`shouldBe` [1, 2]) it "square" do - S.runSensorT (S.sample 2 (count >>= square)) >>= (`shouldBe` [1, 4]) + S.sample 2 (count >>> square) >>= (`shouldBe` [1, 4]) describe "diagram" do it "count diagram" do - S.runSensorT (S.sample 3 (diagram 2 count)) + S.sample 3 (diagram 2 count) >>= (`shouldBe` [[1 :: Int], [1, 2], [2, 3]]) - S.runSensorT (S.sample 5 (diagram 2 slowCount <* count)) + S.sample 5 (diagram 2 slowCount <* count) >>= (`shouldBe` [[1 :: Int], [1], [1, 2], [1, 2], [2, 3]]) -diagram :: (Monad m) => Int -> S.Sensor m () a -> S.Sensor m () [a] +diagram :: Int -> S.Sensor () a -> S.Sensor () [a] diagram n sf = S.feedbackS [] $ proc ((), xs) -> do x <- sf -< () returnA -< (reverse (x : xs), take (n - 1) (x : xs)) -count :: (S.MonadSensor m) => S.Sensor m () Int -count = S.sensor Count - -data Count = Count deriving (Show) - -instance (S.MonadSensor m) => S.Aggregate m Count Int where - aggregate _ = forM_ [1, 2 ..] $ \n -> do - S.yield n +count :: S.Sensor () Int +count = S.sensor (\_ -> "Count") $ \_ yield -> do + forM_ [1, 2 ..] $ \n -> do + yield n sleep -slowCount :: (S.MonadSensor m) => S.Sensor m () Int -slowCount = S.sensor SlowCount - -data SlowCount = SlowCount deriving (Show) - -instance (S.MonadSensor m) => S.Aggregate m SlowCount Int where - aggregate _ = forM_ [1, 2 ..] $ \n -> do - S.yield n +slowCount :: S.Sensor () Int +slowCount = S.sensor (\_ -> "SlowCount") $ \_ yield -> do + forM_ [1, 2 ..] $ \n -> do + yield n sleepLong sleep :: (MonadIO m) => m () @@ -72,19 +65,13 @@ sleep = liftIO (threadDelay 2_000) sleepLong :: (MonadIO m) => m () sleepLong = liftIO (threadDelay 3_000) -square :: (S.MonadSensor m) => Int -> S.Sensor m () Int -square = S.sensor . Square +square :: S.Sensor Int Int +square = S.sensor (\n -> printf "Square %d" n) $ \n yield -> + yield (n * n) -data Square = Square Int deriving (Show) - -instance (S.MonadSensor m) => S.Aggregate m Square Int where - aggregate (Square n) = do - S.yield (n * n) - -currentTime :: (S.MonadSensor m) => S.Sensor m () UTCTime -currentTime = S.sensor CurrentTime - -data CurrentTime = CurrentTime deriving (Show) +currentTime :: S.Sensor () UTCTime +currentTime = S.sensor (\_ -> "CurrentTime") $ \_ yield -> do + yield (UTCTime "1970-01-01" "00:00:00") data UTCTime = UTCTime { date :: String, @@ -92,11 +79,8 @@ data UTCTime = UTCTime } deriving (Show) -instance (S.MonadSensor m) => S.Aggregate m CurrentTime UTCTime where - aggregate _ = S.yield (UTCTime "1970-01-01" "00:00:00") - -date :: (S.MonadSensor m) => S.Sensor m () String +date :: S.Sensor () String date = (.date) <$> currentTime -time :: (S.MonadSensor m) => S.Sensor m () String +time :: S.Sensor () String time = (.time) <$> currentTime |
