{-# LANGUAGE ImplicitParams, NamedFieldPuns, ParallelListComp, PatternGuards #-}

spec :: Spec
spec = do
  describe "split4'8" $ do
    it "0xabc" $ do
      split4'8 0xabc `shouldBe` (0x0a, 0xbc)
    it "0xfff" $ do
      split4'8 0xfff `shouldBe` (0x0f, 0xff)

    describe "(x, y) = split4'8 z" $ do
      prop "x <= 0x0f" $
        \z -> let (x, _) =  split4'8 z in x <= 0x0f
      prop "x << 8 | y == z" $ do
        \z -> let (x, y) = split4'8 z in
          fromIntegral x `shiftL` 8 .|. fromIntegral y == z

match s@Status{ pos, flips, captureAt, captureLen }
  | isOne ?pat = ite (pos .>= strLen) __FAIL__ one
  | otherwise = ite (pos + (toEnum $ minLen ?pat) .> strLen) __FAIL__ $ case ?pat of
    POr ps -> choice flips $ map (\p -> \b -> let ?pat = p in match s{ flips = b }) ps

foo = 1
