{-# OPTIONS_GHC -Wno-monomorphism-restriction #-}

module TestPipes where

import BetaBin (urn, urnP)
import Control.Monad.Bayes.Class ()
import Control.Monad.Bayes.Enumerator (enumerator)
import Data.AEq (AEq ((~==)))
import Data.List (sort)
import HMM (hmm, hmmPosterior)
import Pipes.Prelude (toListM)

urns :: Int -> Bool
urns n = enumerator (urn n) ~== enumerator (urnP n)

hmms :: [Double] -> Bool
hmms observations =
  let hmmWithoutPipe = hmm observations
      hmmWithPipe = reverse . init <$> toListM (hmmPosterior observations)
   in -- Sort enumerator again although it is already sorted, see https://github.com/tweag/monad-bayes/issues/283
      sort (enumerator hmmWithPipe) ~== sort (enumerator hmmWithoutPipe)