packages feed

hw-balancedparens 0.3.0.5 → 0.3.1.0

raw patch · 26 files changed

+974/−160 lines, 26 filesdep ~basedep ~hw-bitsPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, hw-bits

API changes (from Hackage documentation)

- HaskellWorks.Data.BalancedParens.Broadword: findCloseW64 :: Word64 -> Word64
- HaskellWorks.Data.BalancedParens.Broadword: kkBitDiff :: Int -> Word8 -> Word8 -> Word8
- HaskellWorks.Data.BalancedParens.Broadword: kkBitDiffPos :: Int -> Word8 -> Word8 -> Word8
- HaskellWorks.Data.BalancedParens.Broadword: kkBitDiffSimple :: Int -> Word8 -> Word8 -> Word8
- HaskellWorks.Data.BalancedParens.Broadword: ocCalc8 :: Word8 -> Word8 -> Word8
- HaskellWorks.Data.BalancedParens.Broadword: showPadded :: Show a => Int -> a -> String
+ HaskellWorks.Data.BalancedParens.Broadword.Word16: findCloseFar :: Word16 -> Word16 -> Word16
+ HaskellWorks.Data.BalancedParens.Broadword.Word32: findCloseFar :: Word32 -> Word32 -> Word32
+ HaskellWorks.Data.BalancedParens.Broadword.Word64: findClose :: Word64 -> Word64
+ HaskellWorks.Data.BalancedParens.Broadword.Word64: findCloseFar :: Word64 -> Word64 -> Word64
+ HaskellWorks.Data.BalancedParens.Broadword.Word8: findCloseFar :: Word8 -> Word8 -> Word8
+ HaskellWorks.Data.BalancedParens.Internal.Show: showPadded :: Show a => Int -> a -> String
+ HaskellWorks.Data.BalancedParens.Internal.Slow.Word16: findCloseFar :: Word16 -> Word16 -> Word16
+ HaskellWorks.Data.BalancedParens.Internal.Slow.Word32: findCloseFar :: Word32 -> Word32 -> Word32
+ HaskellWorks.Data.BalancedParens.Internal.Slow.Word64: findCloseFar :: Word64 -> Word64 -> Word64
+ HaskellWorks.Data.BalancedParens.Internal.Slow.Word8: findCloseFar :: Word8 -> Word8 -> Word8
+ HaskellWorks.Data.BalancedParens.Internal.Word16: mu0 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word16: mu1 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word16: mu2 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word16: mu3 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word16: mu4 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word32: mu0 :: Word32
+ HaskellWorks.Data.BalancedParens.Internal.Word32: mu1 :: Word32
+ HaskellWorks.Data.BalancedParens.Internal.Word32: mu2 :: Word32
+ HaskellWorks.Data.BalancedParens.Internal.Word32: mu3 :: Word32
+ HaskellWorks.Data.BalancedParens.Internal.Word32: mu4 :: Word32
+ HaskellWorks.Data.BalancedParens.Internal.Word32: mu5 :: Word32
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu0 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu1 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu2 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu3 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu4 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu5 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word64: mu6 :: Word64
+ HaskellWorks.Data.BalancedParens.Internal.Word8: mu0 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word8: mu1 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word8: mu2 :: Word16
+ HaskellWorks.Data.BalancedParens.Internal.Word8: mu3 :: Word16

Files

bench/Main.hs view
@@ -3,21 +3,24 @@ module Main where  import Criterion.Main-import Data.Semigroup                               ((<>)) import Data.Word import HaskellWorks.Data.BalancedParens.FindClose+import HaskellWorks.Data.Bits.BitShow+import HaskellWorks.Data.Bits.BitWise import HaskellWorks.Data.Bits.Broadword.Type import HaskellWorks.Data.Bits.FromBitTextByteString import HaskellWorks.Data.Naive import HaskellWorks.Data.Ops -import qualified Data.Vector.Storable                       as DVS-import qualified HaskellWorks.Data.BalancedParens.Gen       as G-import qualified HaskellWorks.Data.BalancedParens.ParensSeq as PS-import qualified HaskellWorks.Data.BalancedParens.RangeMin  as RM-import qualified HaskellWorks.Data.BalancedParens.RangeMin2 as RM2-import qualified Hedgehog.Gen                               as G-import qualified Hedgehog.Range                             as R+import qualified Data.Vector.Storable                                  as DVS+import qualified HaskellWorks.Data.BalancedParens.Broadword.Word64     as BW64+import qualified HaskellWorks.Data.BalancedParens.Gen                  as G+import qualified HaskellWorks.Data.BalancedParens.Internal.Slow.Word64 as SW64+import qualified HaskellWorks.Data.BalancedParens.ParensSeq            as PS+import qualified HaskellWorks.Data.BalancedParens.RangeMin             as RM+import qualified HaskellWorks.Data.BalancedParens.RangeMin2            as RM2+import qualified Hedgehog.Gen                                          as G+import qualified Hedgehog.Range                                        as R  setupEnvVector :: Int -> IO (DVS.Vector Word64) setupEnvVector n = return $ DVS.fromList (take n (cycle [maxBound, 0]))@@ -46,6 +49,16 @@ setupEnvBP64 :: IO Word64 setupEnvBP64 = return $ DVS.head (fromBitTextByteString "11111000 11101000 11101000 11101000 11101000 11101000 11101000 11100000") +benchWord64 :: [Benchmark]+benchWord64 = foldMap mkBenchWord64Group [0 .. 64]+  where mkBenchWord64Group :: Word64 -> [Benchmark]+        mkBenchWord64Group p = let q = (1 .<. p) - 1 in+          [ bgroup "Word64"+            [ bench ("Broadword find close " <> bitShow q) (whnf (BW64.findCloseFar 0) q)+            , bench ("Naive     find close " <> bitShow q) (whnf (SW64.findCloseFar 0) q)+            ]+          ]+ benchVector :: [Benchmark] benchVector =   [ bgroup "Vector"@@ -124,6 +137,7 @@  main :: IO () main = defaultMain $ mempty+  <> benchWord64   <> benchVector   <> benchRm   <> benchRm2
gen/HaskellWorks/Data/BalancedParens/Gen.hs view
@@ -15,7 +15,6 @@   ) where  import Data.Coerce-import Data.Semigroup                             ((<>)) import Data.Word import GHC.Generics import HaskellWorks.Data.BalancedParens.ParensSeq (ParensSeq)
hw-balancedparens.cabal view
@@ -1,7 +1,7 @@-cabal-version:  2.2+cabal-version: 2.2  name:                   hw-balancedparens-version:                0.3.0.5+version:                0.3.1.0 synopsis:               Balanced parentheses description:            Balanced parentheses. category:               Data, Bit, Succinct Data Structures, Data Structures@@ -9,10 +9,10 @@ bug-reports:            https://github.com/haskell-works/hw-balancedparens/issues author:                 John Ky maintainer:             newhoggy@gmail.com-copyright:              2016-2019 John Ky+copyright:              2016-2020 John Ky license:                BSD-3-Clause license-file:           LICENSE-tested-with:            GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2+tested-with:            GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4 build-type:             Simple extra-source-files:     README.md @@ -20,22 +20,22 @@   type:     git   location: https://github.com/haskell-works/hw-balancedparens -common base                     { build-depends: base                     >= 4.10       && < 5      }+common base                       { build-depends: base                       >= 4.11       && < 5      } -common criterion                { build-depends: criterion                >= 1.2        && < 1.6    }-common deepseq                  { build-depends: deepseq                  >= 1.4.2.0    && < 1.5    }-common doctest                  { build-depends: doctest                  >= 0.16.2     && < 0.17   }-common doctest-discover         { build-depends: doctest-discover         >= 0.2        && < 0.3    }-common hedgehog                 { build-depends: hedgehog                 >= 1.0        && < 1.1    }-common hspec                    { build-depends: hspec                    >= 2.2        && < 3.0    }-common hw-hspec-hedgehog        { build-depends: hw-hspec-hedgehog        >= 0.1        && < 0.2    }-common hw-bits                  { build-depends: hw-bits                  >= 0.7.1.2    && < 0.8    }-common hw-excess                { build-depends: hw-excess                >= 0.2.2.0    && < 0.3    }-common hw-fingertree            { build-depends: hw-fingertree            >= 0.1.1.0    && < 0.2    }-common hw-prim                  { build-depends: hw-prim                  >= 0.6.2.25   && < 0.7    }-common hw-rankselect-base       { build-depends: hw-rankselect-base       >= 0.3.2.1    && < 0.4    }-common transformers             { build-depends: transformers             >= 0.5.2      && < 0.6    }-common vector                   { build-depends: vector                   >= 0.12       && < 0.13   }+common criterion                  { build-depends: criterion                  >= 1.2        && < 1.6    }+common deepseq                    { build-depends: deepseq                    >= 1.4.2.0    && < 1.5    }+common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.17   }+common doctest-discover           { build-depends: doctest-discover           >= 0.2        && < 0.3    }+common hedgehog                   { build-depends: hedgehog                   >= 1.0        && < 1.1    }+common hspec                      { build-depends: hspec                      >= 2.2        && < 3.0    }+common hw-hspec-hedgehog          { build-depends: hw-hspec-hedgehog          >= 0.1        && < 0.2    }+common hw-bits                    { build-depends: hw-bits                    >= 0.7.1.5    && < 0.8    }+common hw-excess                  { build-depends: hw-excess                  >= 0.2.2.0    && < 0.3    }+common hw-fingertree              { build-depends: hw-fingertree              >= 0.1.1.0    && < 0.2    }+common hw-prim                    { build-depends: hw-prim                    >= 0.6.2.25   && < 0.7    }+common hw-rankselect-base         { build-depends: hw-rankselect-base         >= 0.3.2.1    && < 0.4    }+common transformers               { build-depends: transformers               >= 0.5.2      && < 0.6    }+common vector                     { build-depends: vector                     >= 0.12       && < 0.13   }  common hw-balancedparens   build-depends:        hw-balancedparens@@ -58,7 +58,10 @@                       , vector   exposed-modules:      HaskellWorks.Data.BalancedParens                         HaskellWorks.Data.BalancedParens.BalancedParens-                        HaskellWorks.Data.BalancedParens.Broadword+                        HaskellWorks.Data.BalancedParens.Broadword.Word16+                        HaskellWorks.Data.BalancedParens.Broadword.Word32+                        HaskellWorks.Data.BalancedParens.Broadword.Word64+                        HaskellWorks.Data.BalancedParens.Broadword.Word8                         HaskellWorks.Data.BalancedParens.CloseAt                         HaskellWorks.Data.BalancedParens.Enclose                         HaskellWorks.Data.BalancedParens.FindClose@@ -68,9 +71,18 @@                         HaskellWorks.Data.BalancedParens.Internal.List                         HaskellWorks.Data.BalancedParens.Internal.ParensSeq                         HaskellWorks.Data.BalancedParens.Internal.RoseTree+                        HaskellWorks.Data.BalancedParens.Internal.Show+                        HaskellWorks.Data.BalancedParens.Internal.Slow.Word16+                        HaskellWorks.Data.BalancedParens.Internal.Slow.Word32+                        HaskellWorks.Data.BalancedParens.Internal.Slow.Word64+                        HaskellWorks.Data.BalancedParens.Internal.Slow.Word8                         HaskellWorks.Data.BalancedParens.Internal.Trace                         HaskellWorks.Data.BalancedParens.Internal.Vector.Storable                         HaskellWorks.Data.BalancedParens.Internal.Word+                        HaskellWorks.Data.BalancedParens.Internal.Word16+                        HaskellWorks.Data.BalancedParens.Internal.Word32+                        HaskellWorks.Data.BalancedParens.Internal.Word64+                        HaskellWorks.Data.BalancedParens.Internal.Word8                         HaskellWorks.Data.BalancedParens.NewCloseAt                         HaskellWorks.Data.BalancedParens.NewOpenAt                         HaskellWorks.Data.BalancedParens.OpenAt@@ -108,7 +120,11 @@                       , vector   type:                 exitcode-stdio-1.0   main-is:              Spec.hs-  other-modules:        HaskellWorks.Data.BalancedParens.Internal.BroadwordSpec+  other-modules:        HaskellWorks.Data.BalancedParens.Broadword.Word8Spec+                        HaskellWorks.Data.BalancedParens.Broadword.Word16Spec+                        HaskellWorks.Data.BalancedParens.Broadword.Word32Spec+                        HaskellWorks.Data.BalancedParens.Broadword.Word64Spec+                        HaskellWorks.Data.BalancedParens.Internal.BroadwordSpec                         HaskellWorks.Data.BalancedParens.Internal.ParensSeqSpec                         HaskellWorks.Data.BalancedParens.FindCloseNSpec                         HaskellWorks.Data.BalancedParens.RangeMin2Spec
− src/HaskellWorks/Data/BalancedParens/Broadword.hs
@@ -1,122 +0,0 @@-{-# LANGUAGE BangPatterns        #-}-{-# LANGUAGE FlexibleContexts    #-}-{-# LANGUAGE FlexibleInstances   #-}-{-# LANGUAGE InstanceSigs        #-}-{-# LANGUAGE ScopedTypeVariables #-}--module HaskellWorks.Data.BalancedParens.Broadword-  ( findCloseW64-  , ocCalc8-  , showPadded-  , kkBitDiffPos-  , kkBitDiff-  , kkBitDiffSimple-  ) where--import Data.Int-import Data.Word-import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.Bits.Broadword.Word64-import HaskellWorks.Data.Bits.Word64--import qualified Data.Bits as DB---- Source:---    Broadword Implementation of Parenthesis Queries---    Sebastiano Vigna---    Dipartimento di Scienze dell’Informazione---    Università degli Studi di Milano, Italy-findCloseW64 :: Word64 -> Word64-findCloseW64 x =                                                                                     -- let !_ = traceW "x00" x   in-  let !b00 = x - ((x .&. 0xaaaaaaaaaaaaaaaa) .>. 1)                                               in -- let !_ = traceW "b00" b00 in-  let !b01 = (b00 .&. 0x3333333333333333) + ((b00 .>. 2) .&. 0x3333333333333333)                  in -- let !_ = traceW "b01" b01 in-  let !b02 = (b01 + (b01 .>. 4)) .&. 0x0f0f0f0f0f0f0f0f                                           in -- let !_ = traceW "b02" b02 in-  let !b03 = (b02 * 0x0101010101010101) .<. 1                                                     in -- let !_ = traceW "b03" b03 in-  let !b04 = kBitDiffUnsafe 8 (h 8 .|. 0x4038302820181008) b03                                    in -- let !_ = traceW "b04" b04 in-  let !u00 = (((((b04 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in -- let !_ = traceW "u00" u00 in-  let !z00 =                         ((h 8 .>. 1) .|. (l 8 * 7)) .&. u00                          in -- let !_ = traceW "z00" z00 in--  let !d10 = (l 8 * 2 - (((x .>. 6) .&. (l 8 .<. 1)) + ((x .>. 5) .&. (l 8 .<. 1))))              in -- let !_ = traceW "d10" d10 in-  let !b10 = b04 - d10                                                                            in -- let !_ = traceW "b10" b10 in-  let !u10 = (((((b10 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in -- let !_ = traceW "u10" u10 in-  let !z10 = (z00 .&. comp u10) .|. (((h 8 .>. 1) .|. (l 8 * 5)) .&. u10)                         in -- let !_ = traceW "z10" z10 in--  let !d20 = (l 8 * 2 - (((x .>. 4) .&. (l 8 .<. 1)) + ((x .>. 3) .&. (l 8 .<. 1))))              in -- let !_ = traceW "d20" d20 in-  let !b20 = b10 - d20                                                                            in -- let !_ = traceW "b20" b20 in-  let !u20 = (((((b20 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in -- let !_ = traceW "u20" u20 in-  let !z20 = (z10 .&. comp u20) .|. (((h 8 .>. 1) .|. (l 8 * 3)) .&. u20)                         in -- let !_ = traceW "z20" z20 in--  let !d30 = (l 8 * 2 - (((x .>. 2) .&. (l 8 .<. 1)) + ((x .>. 1) .&. (l 8 .<. 1))))              in -- let !_ = traceW "d30" d30 in-  let !b30 = b20 - d30                                                                            in -- let !_ = traceW "b30" b30 in-  let !u30 = (((((b30 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in -- let !_ = traceW "u30" u30 in-  let !z30 = (z20 .&. comp u30) .|. (((h 8 .>. 1) .|.  l 8     ) .&. u30)                         in -- let !_ = traceW "z30" z30 in--  let !p00 = lsb (z30 .>. 6 .&. l 8)                                                              in -- let !_ = traceW "p00" p00 in-  let !r00 = ((p00 + ((z30 .>. fromIntegral (p00 .&. 0x3f)) .&. 0x3f)) .|. (p00 .>. 8)) .&. 0x7f  in -- let !_ = traceW "r00" r00 in-  r00-{-# INLINE findCloseW64 #-}--µµ1 :: Word8-µµ1 = 0x33--hh :: Int -> Word8-hh 2  = 0xaa-hh 4  = 0x88-hh 8  = 0x80-hh 16 = 0x80-hh 32 = 0x80-hh 64 = 0x80-hh k  = error ("Invalid h k where k = " ++ show k)-{-# INLINE hh #-}--kkBitDiff :: Int -> Word8 -> Word8 -> Word8-kkBitDiff k x y = ((x .|. hh k) - (y .&. comp (hh k))) .^. ((x .^. comp y) .&. hh k)-{-# INLINE kkBitDiff #-}--kkBitDiffSimple :: Int -> Word8 -> Word8 -> Word8-kkBitDiffSimple k x y = ((x .|. hh k) - y) .^. hh k-{-# INLINE kkBitDiffSimple #-}--kkBitDiffPos :: Int -> Word8 -> Word8 -> Word8-kkBitDiffPos k x y = let d = kkBitDiff k x y in d .&. kkBitDiff k (d .>. fromIntegral (k - 1)) 1-{-# INLINE kkBitDiffPos #-}--showPadded :: Show a => Int -> a -> String-showPadded n a = reverse (take n (reverse (show a) ++ [' ', ' ' ..]))--(.>+.) :: Word8 -> Int -> Word8-(.>+.) w n = fromIntegral ((fromIntegral w :: Int8) `DB.shift` (-n))--ocCalc8 :: Word8 -> Word8 -> Word8-ocCalc8 p x =-  let b0  =   x .&. 0x55                                                            in-  let b1  =  (x .&. 0xAA) .>. 1                                                     in-  let ll  =  (b0 .^. b1) .&. b1                                                     in-  let o1  =  (b0 .&. b1)           .<. 1 .|. ll                                     in-  let c1  = ((b0 .|. b1) .^. 0x55) .<. 1 .|. ll                                     in--  -- arithmetic operators come first, ordered in the standard way-  -- followed by shifts-  -- .&.-  -- .^.-  -- .|.-  let eo1 =   o1 .&.  µµ1                                                           in-  let ec1 =  (c1 .&. (µµ1 .<.  2)) .>.  2                                           in-  let o2  = ((o1 .&. (µµ1 .<.  2)) .>.  2) + kkBitDiffPos 4 eo1 ec1                 in-  let c2  =  (c1 .&.  µµ1)                 + kkBitDiffPos 4 ec1 eo1                 in--  let bb2  = ((((c2 .>. 0) .&. 15) - p) .>+. 7)                                     in-  let mm2  = bb2 .&. 15                                                             in-  let pa2  = p   - (c2 .&. mm2)                                                     in-  let pb2  = pa2 + (o2 .&. mm2)                                                     in-  let ss2  = 4 .&. bb2                                                              in--  let bb1  = ((((c1 .>. fromIntegral ss2) .&. 3) - pb2) .>+. 7)                     in-  let mm1  = bb1 .&. 3                                                              in-  let pa1  = pa2 - (c1 .&. mm1)                                                     in-  let pb1  = pa1 + (o1 .&. mm1)                                                     in-  let ss1  = ss2 + (2  .&. bb1)                                                     in--  let rrr  = ss1 + pb1 + (((x .>. fromIntegral ss1) .&. ((pb1 .<. 1) .|. 1)) .<. 1) in--  rrr
+ src/HaskellWorks/Data/BalancedParens/Broadword/Word16.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE FlexibleContexts    #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE InstanceSigs        #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word16+  ( findCloseFar+  ) where++import Data.Int+import Data.Word+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Bits.Broadword.Word16++muk1 :: Word16+muk1 = 0x3333+{-# INLINE muk1 #-}++muk2 :: Word16+muk2 = 0x0f0f+{-# INLINE muk2 #-}++muk3 :: Word16+muk3 = 0x00ff+{-# INLINE muk3 #-}++findCloseFar :: Word16 -> Word16 -> Word16+findCloseFar p w =+  let x     = w .>. fromIntegral p                                                        in+  let wsz   = 16 :: Int16                                                                 in+  let k1    = 1                                                                           in+  let k2    = 2                                                                           in+  let k3    = 3                                                                           in+  let k4    = 4                                                                           in+  let mask1 = (1 .<. (1 .<. k1)) - 1                                                      in+  let mask2 = (1 .<. (1 .<. k2)) - 1                                                      in+  let mask3 = (1 .<. (1 .<. k3)) - 1                                                      in+  let mask4 = (1 .<. (1 .<. k4)) - 1                                                      in+  let t64k1 = 1 .<. k1 :: Word64                                                          in+  let t64k2 = 1 .<. k2 :: Word64                                                          in+  let t64k3 = 1 .<. k3 :: Word64                                                          in+  let t8k1  = 1 .<. k1 :: Word16                                                          in+  let t8k2  = 1 .<. k2 :: Word16                                                          in+  let t8k3  = 1 .<. k3 :: Word16                                                          in+  let t8k4  = 1 .<. k4 :: Word16                                                          in++  let b0    =      x .&. 0x5555                                                           in+  let b1    =    ( x .&. 0xaaaa) .>. 1                                                    in+  let ll    =   (b0  .^. b1  ) .&. b1                                                     in+  let ok1   = ( (b0  .&. b1  )             .<. 1) .|. ll                                  in+  let ck1   = (((b0  .|. b1  ) .^. 0x5555) .<. 1) .|. ll                                  in++  let eok1 =   ok1 .&.  muk1                                                              in+  let eck1 =  (ck1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2L =  (ok1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2R = kBitDiffPos 4 eok1 eck1                                                      in+  let ok2  = ok2L + ok2R                                                                  in+  let ck2  =  (ck1 .&.  muk1) + kBitDiffPos 4 eck1 eok1                                   in++  let eok2 =   ok2 .&.  muk2                                                              in+  let eck2 =  (ck2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3L =  (ok2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3R = kBitDiffPos 8 eok2 eck2                                                      in+  let ok3  = ok3L + ok3R                                                                  in+  let ck3  =  (ck2 .&.  muk2) + kBitDiffPos 8 eck2 eok2                                   in++  let eok3 =   ok3 .&.  muk3                                                              in+  let eck3 =  (ck3 .&. (muk3 .<. t64k3)) .>. t64k3                                        in+  let ok4L =  (ok3 .&. (muk3 .<. t64k3)) .>. t64k3                                        in+  let ok4R = kBitDiffPos 16 eok3 eck3                                                     in+  let ok4  = ok4L + ok4R                                                                  in+  let ck4  =  (ck3 .&.  muk3) + kBitDiffPos 16 eck3 eok3                                  in++  let pak4  = 0                                                                           in+  let sak4  = 0                                                                           in++  let fk4   = (ck4 .>. fromIntegral sak4) .&. mask4                                       in+  let bk4   = ((pak4 - fk4) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk4   = bk4 .&. mask4                                                               in+  let pbk4  = pak4 - ((ck4 .>. fromIntegral sak4) .&. mk4)                                in+  let pck4  = pbk4 + ((ok4 .>. fromIntegral sak4) .&. mk4)                                in+  let sbk4  = sak4 + (t8k4 .&. bk4)                                                       in++  let pak3  = pck4                                                                        in+  let sak3  = sbk4                                                                        in++  let ek3   = 0x0808 .&. comp (0xffff .>. fromIntegral sak3)                              in+  let fk3   = ((ck3 .>. fromIntegral sak3) .|. ek3) .&. mask3                             in+  let bk3   = ((pak3 - fk3) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk3   = bk3 .&. mask3                                                               in+  let pbk3  = pak3 - (((ck3 .>. fromIntegral sak3) .|. ek3) .&. mk3)                      in+  let pck3  = pbk3 + ( (ok3 .>. fromIntegral sak3)          .&. mk3)                      in+  let sbk3  = sak3 + (t8k3 .&. bk3)                                                       in++  let pak2  = pck3                                                                        in+  let sak2  = sbk3                                                                        in++  let ek2   = 0xaaaa .&. comp (0xffff .>. fromIntegral sak2)                              in+  let fk2   = ((ck2 .>. fromIntegral sak2) .|. ek2) .&. mask2                             in+  let bk2   = ((pak2 - fk2) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk2   = bk2 .&. mask2                                                               in+  let pbk2  = pak2 - (((ck2 .>. fromIntegral sak2) .|. ek2) .&. mk2)                      in+  let pck2  = pbk2 + ( (ok2 .>. fromIntegral sak2)          .&. mk2)                      in+  let sbk2  = sak2 + (t8k2 .&. bk2)                                                       in++  let pak1  = pck2                                                                        in+  let sak1  = sbk2                                                                        in++  let ek1   = 0xaaaa .&. comp (0xffff .>. fromIntegral sak1)                              in+  let fk1   = ((ck1 .>. fromIntegral sak1) .|. ek1) .&. mask1                             in+  let bk1   = ((pak1 - fk1) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk1   = bk1  .&. mask1                                                              in+  let pbk1  = pak1 - (((ck1 .>. fromIntegral sak1) .|. ek1) .&. mk1)                      in+  let pck1  = pbk1 + ( (ok1 .>. fromIntegral sak1)          .&. mk1)                      in+  let sbk1  = sak1 + (t8k1 .&. bk1)                                                       in++  let rrr   = sbk1 + pck1 + (((x .>. fromIntegral sbk1) .&. ((pck1 .<. 1) .|. 1)) .<. 1)  in++  rrr + p+{-# INLINE findCloseFar #-}
+ src/HaskellWorks/Data/BalancedParens/Broadword/Word32.hs view
@@ -0,0 +1,146 @@+{-# LANGUAGE FlexibleContexts    #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE InstanceSigs        #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word32+  ( findCloseFar+  ) where++import Data.Int+import Data.Word+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Bits.Broadword.Word32++muk1 :: Word32+muk1 = 0x33333333+{-# INLINE muk1 #-}++muk2 :: Word32+muk2 = 0x0f0f0f0f+{-# INLINE muk2 #-}++muk3 :: Word32+muk3 = 0x00ff00ff+{-# INLINE muk3 #-}++muk4 :: Word32+muk4 = 0x0000ffff+{-# INLINE muk4 #-}++findCloseFar :: Word32 -> Word32 -> Word32+findCloseFar p w =+  let x     = w .>. fromIntegral p                                                        in+  let wsz   = 32 :: Int32                                                                 in+  let k1    = 1                                                                           in+  let k2    = 2                                                                           in+  let k3    = 3                                                                           in+  let k4    = 4                                                                           in+  let k5    = 5                                                                           in+  let mask1 = (1 .<. (1 .<. k1)) - 1                                                      in+  let mask2 = (1 .<. (1 .<. k2)) - 1                                                      in+  let mask3 = (1 .<. (1 .<. k3)) - 1                                                      in+  let mask4 = (1 .<. (1 .<. k4)) - 1                                                      in+  let mask5 = (1 .<. (1 .<. k5)) - 1                                                      in+  let t64k1 = 1 .<. k1 :: Word64                                                          in+  let t64k2 = 1 .<. k2 :: Word64                                                          in+  let t64k3 = 1 .<. k3 :: Word64                                                          in+  let t64k4 = 1 .<. k4 :: Word64                                                          in+  let t8k1  = 1 .<. k1 :: Word32                                                          in+  let t8k2  = 1 .<. k2 :: Word32                                                          in+  let t8k3  = 1 .<. k3 :: Word32                                                          in+  let t8k4  = 1 .<. k4 :: Word32                                                          in+  let t8k5  = 1 .<. k5 :: Word32                                                          in++  let b0    =      x .&. 0x55555555                                                       in+  let b1    =    ( x .&. 0xaaaaaaaa) .>. 1                                                in+  let ll    =   (b0  .^. b1  ) .&. b1                                                     in+  let ok1   = ( (b0  .&. b1  )                 .<. 1) .|. ll                              in+  let ck1   = (((b0  .|. b1  ) .^. 0x55555555) .<. 1) .|. ll                              in++  let eok1 =   ok1 .&.  muk1                                                              in+  let eck1 =  (ck1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2L =  (ok1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2R = kBitDiffPos 4 eok1 eck1                                                      in+  let ok2  = ok2L + ok2R                                                                  in+  let ck2  =  (ck1 .&.  muk1) + kBitDiffPos 4 eck1 eok1                                   in++  let eok2 =   ok2 .&.  muk2                                                              in+  let eck2 =  (ck2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3L = ((ok2 .&. (muk2 .<. t64k2)) .>. t64k2)                                       in+  let ok3R = kBitDiffPos 8 eok2 eck2                                                      in+  let ok3  = ok3L + ok3R                                                                  in+  let ck3  =  (ck2 .&.  muk2) + kBitDiffPos 8 eck2 eok2                                   in++  let eok3 =   ok3 .&.  muk3                                                              in+  let eck3 =  (ck3 .&. (muk3 .<. t64k3)) .>. t64k3                                        in+  let ok4L = ((ok3 .&. (muk3 .<. t64k3)) .>. t64k3)                                       in+  let ok4R = kBitDiffPos 16 eok3 eck3                                                     in+  let ok4  = ok4L + ok4R                                                                  in+  let ck4  =  (ck3 .&.  muk3) + kBitDiffPos 16 eck3 eok3                                  in++  let eok4 =   ok4 .&.  muk4                                                              in+  let eck4 =  (ck4 .&. (muk4 .<. t64k4)) .>. t64k4                                        in+  let ok5L = ((ok4 .&. (muk4 .<. t64k4)) .>. t64k4)                                       in+  let ok5R = kBitDiffPos 32 eok4 eck4                                                     in+  let ok5  = ok5L + ok5R                                                                  in+  let ck5  =  (ck4 .&.  muk4) + kBitDiffPos 32 eck4 eok4                                  in++  let pak5  = 0                                                                           in+  let sak5  = 0                                                                           in++  let fk5   = (ck5 .>. fromIntegral sak5) .&. mask5                                       in+  let bk5   = ((pak5 - fk5) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk5   = bk5 .&. mask5                                                               in+  let pbk5  = pak5 - ((ck5 .>. fromIntegral sak5) .&. mk5)                                in+  let pck5  = pbk5 + ((ok5 .>. fromIntegral sak5) .&. mk5)                                in+  let sbk5  = sak5 + (t8k5 .&. bk5)                                                       in++  let pak4  = pck5                                                                        in+  let sak4  = sbk5                                                                        in++  let ek4   = 0x00100010 .&. comp (0xffffffff .>. fromIntegral sak4)                      in+  let fk4   = ((ck4 .>. fromIntegral sak4) .|. ek4) .&. mask4                             in+  let bk4   = ((pak4 - fk4) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk4   = bk4 .&. mask4                                                               in+  let pbk4  = pak4 - (((ck4 .>. fromIntegral sak4) .|. ek4) .&. mk4)                      in+  let pck4  = pbk4 + ( (ok4 .>. fromIntegral sak4)          .&. mk4)                      in+  let sbk4  = sak4 + (t8k4 .&. bk4)                                                       in++  let pak3  = pck4                                                                        in+  let sak3  = sbk4                                                                        in++  let ek3   = 0x08080808 .&. comp (0xffffffff .>. fromIntegral sak3)                      in+  let fk3   = ((ck3 .>. fromIntegral sak3) .|. ek3) .&. mask3                             in+  let bk3   = ((pak3 - fk3) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk3   = bk3 .&. mask3                                                               in+  let pbk3  = pak3 - (((ck3 .>. fromIntegral sak3) .|. ek3) .&. mk3)                      in+  let pck3  = pbk3 + ( (ok3 .>. fromIntegral sak3)          .&. mk3)                      in+  let sbk3  = sak3 + (t8k3 .&. bk3)                                                       in++  let pak2  = pck3                                                                        in+  let sak2  = sbk3                                                                        in++  let ek2   = 0xaaaaaaaa .&. comp (0xffffffff .>. fromIntegral sak2)                      in+  let fk2   = ((ck2 .>. fromIntegral sak2) .|. ek2) .&. mask2                             in+  let bk2   = ((pak2 - fk2) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk2   = bk2 .&. mask2                                                               in+  let pbk2  = pak2 - (((ck2 .>. fromIntegral sak2) .|. ek2) .&. mk2)                      in+  let pck2  = pbk2 + ( (ok2 .>. fromIntegral sak2)          .&. mk2)                      in+  let sbk2  = sak2 + (t8k2 .&. bk2)                                                       in++  let pak1  = pck2                                                                        in+  let sak1  = sbk2                                                                        in++  let ek1   = 0xaaaaaaaa .&. comp (0xffffffff .>. fromIntegral sak1)                      in+  let fk1   = ((ck1 .>. fromIntegral sak1) .|. ek1) .&. mask1                             in+  let bk1   = ((pak1 - fk1) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk1   = bk1  .&. mask1                                                              in+  let pbk1  = pak1 - (((ck1 .>. fromIntegral sak1) .|. ek1) .&. mk1)                      in+  let pck1  = pbk1 + ( (ok1 .>. fromIntegral sak1)          .&. mk1)                      in+  let sbk1  = sak1 + (t8k1 .&. bk1)                                                       in++  let rrr   = sbk1 + pck1 + (((x .>. fromIntegral sbk1) .&. ((pck1 .<. 1) .|. 1)) .<. 1)  in++  rrr + p+{-# INLINE findCloseFar #-}
+ src/HaskellWorks/Data/BalancedParens/Broadword/Word64.hs view
@@ -0,0 +1,210 @@+{-# LANGUAGE BangPatterns        #-}+{-# LANGUAGE FlexibleContexts    #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE InstanceSigs        #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word64+  ( findClose+  , findCloseFar+  ) where++import Data.Int+import Data.Word+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Bits.Broadword.Word64+import HaskellWorks.Data.Bits.Word64++muk1 :: Word64+muk1 = 0x3333333333333333+{-# INLINE muk1 #-}++muk2 :: Word64+muk2 = 0x0f0f0f0f0f0f0f0f+{-# INLINE muk2 #-}++muk3 :: Word64+muk3 = 0x00ff00ff00ff00ff+{-# INLINE muk3 #-}++muk4 :: Word64+muk4 = 0x0000ffff0000ffff+{-# INLINE muk4 #-}++muk5 :: Word64+muk5 = 0x00000000ffffffff+{-# INLINE muk5 #-}++findCloseFar :: Word64 -> Word64 -> Word64+findCloseFar p w =+  let x     = w .>. p                                                                     in+  let wsz   = 64 :: Int64                                                                 in+  let k1    = 1                                                                           in+  let k2    = 2                                                                           in+  let k3    = 3                                                                           in+  let k4    = 4                                                                           in+  let k5    = 5                                                                           in+  let k6    = 6                                                                           in+  let mask1 = (1 .<. (1 .<. k1)) - 1                                                      in+  let mask2 = (1 .<. (1 .<. k2)) - 1                                                      in+  let mask3 = (1 .<. (1 .<. k3)) - 1                                                      in+  let mask4 = (1 .<. (1 .<. k4)) - 1                                                      in+  let mask5 = (1 .<. (1 .<. k5)) - 1                                                      in+  let mask6 = (1 .<. (1 .<. k6)) - 1                                                      in+  let t64k1 = 1 .<. k1 :: Word64                                                          in+  let t64k2 = 1 .<. k2 :: Word64                                                          in+  let t64k3 = 1 .<. k3 :: Word64                                                          in+  let t64k4 = 1 .<. k4 :: Word64                                                          in+  let t64k5 = 1 .<. k5 :: Word64                                                          in+  let t8k1  = 1 .<. k1 :: Word64                                                          in+  let t8k2  = 1 .<. k2 :: Word64                                                          in+  let t8k3  = 1 .<. k3 :: Word64                                                          in+  let t8k4  = 1 .<. k4 :: Word64                                                          in+  let t8k5  = 1 .<. k5 :: Word64                                                          in+  let t8k6  = 1 .<. k6 :: Word64                                                          in++  let b0    =      x .&. 0x5555555555555555                                               in+  let b1    =    ( x .&. 0xaaaaaaaaaaaaaaaa) .>. 1                                        in+  let ll    =   (b0  .^. b1  ) .&. b1                                                     in+  let ok1   = ( (b0  .&. b1  )                         .<. 1) .|. ll                      in+  let ck1   = (((b0  .|. b1  ) .^. 0x5555555555555555) .<. 1) .|. ll                      in++  let eok1 =   ok1 .&.  muk1                                                              in+  let eck1 =  (ck1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2L =  (ok1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2R = kBitDiffPos 4 eok1 eck1                                                      in+  let ok2  = ok2L + ok2R                                                                  in+  let ck2  =  (ck1 .&.  muk1) + kBitDiffPos 4 eck1 eok1                                   in++  let eok2 =   ok2 .&.  muk2                                                              in+  let eck2 =  (ck2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3L =  (ok2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3R = kBitDiffPos 8 eok2 eck2                                                      in+  let ok3  = ok3L + ok3R                                                                  in+  let ck3  =  (ck2 .&.  muk2) + kBitDiffPos 8 eck2 eok2                                   in++  let eok3 =   ok3 .&.  muk3                                                              in+  let eck3 =  (ck3 .&. (muk3 .<. t64k3)) .>. t64k3                                        in+  let ok4L =  (ok3 .&. (muk3 .<. t64k3)) .>. t64k3                                        in+  let ok4R = kBitDiffPos 16 eok3 eck3                                                     in+  let ok4  = ok4L + ok4R                                                                  in+  let ck4  =  (ck3 .&.  muk3) + kBitDiffPos 16 eck3 eok3                                  in++  let eok4 =   ok4 .&.  muk4                                                              in+  let eck4 =  (ck4 .&. (muk4 .<. t64k4)) .>. t64k4                                        in+  let ok5L =  (ok4 .&. (muk4 .<. t64k4)) .>. t64k4                                        in+  let ok5R = kBitDiffPos 32 eok4 eck4                                                     in+  let ok5  = ok5L + ok5R                                                                  in+  let ck5  =  (ck4 .&.  muk4) + kBitDiffPos 32 eck4 eok4                                  in++  let eok5 =   ok5 .&.  muk5                                                              in+  let eck5 =  (ck5 .&. (muk5 .<. t64k5)) .>. t64k5                                        in+  let ok6L =  (ok5 .&. (muk5 .<. t64k5)) .>. t64k5                                        in+  let ok6R = kBitDiffPos 32 eok5 eck5                                                     in+  let ok6  = ok6L + ok6R                                                                  in+  let ck6  =  (ck5 .&.  muk5) + kBitDiffPos 32 eck5 eok5                                  in++  let qak6  = 0                                                                           in+  let sak6  = 0                                                                           in++  let fk6   = (ck6 .>. fromIntegral sak6) .&. mask6                                       in+  let bk6   = ((qak6 - fk6) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk6   = bk6 .&. mask6                                                               in+  let pbk6  = qak6 - ((ck6 .>. fromIntegral sak6) .&. mk6)                                in+  let pck6  = pbk6 + ((ok6 .>. fromIntegral sak6) .&. mk6)                                in+  let sbk6  = sak6 + (t8k6 .&. bk6)                                                       in++  let qak5  = pck6                                                                        in+  let sak5  = sbk6                                                                        in++  let ek5   = 0x0000002000000020 .&. comp (0xffffffffffffffff .>. fromIntegral sak5)      in+  let fk5   = ((ck5 .>. fromIntegral sak5) .|. ek5) .&. mask5                             in+  let bk5   = ((qak5 - fk5) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk5   = bk5 .&. mask5                                                               in+  let pbk5  = qak5 - (((ck5 .>. fromIntegral sak5) .|. ek5) .&. mk5)                      in+  let pck5  = pbk5 + ( (ok5 .>. fromIntegral sak5)          .&. mk5)                      in+  let sbk5  = sak5 + (t8k5 .&. bk5)                                                       in++  let qak4  = pck5                                                                        in+  let sak4  = sbk5                                                                        in++  let ek4   = 0x0010001000100010 .&. comp (0xffffffffffffffff .>. fromIntegral sak4)      in+  let fk4   = ((ck4 .>. fromIntegral sak4) .|. ek4) .&. mask4                             in+  let bk4   = ((qak4 - fk4) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk4   = bk4 .&. mask4                                                               in+  let pbk4  = qak4 - (((ck4 .>. fromIntegral sak4) .|. ek4) .&. mk4)                      in+  let pck4  = pbk4 + ( (ok4 .>. fromIntegral sak4)          .&. mk4)                      in+  let sbk4  = sak4 + (t8k4 .&. bk4)                                                       in++  let qak3  = pck4                                                                        in+  let sak3  = sbk4                                                                        in++  let ek3   = 0x0808080808080808 .&. comp (0xffffffffffffffff .>. fromIntegral sak3)      in+  let fk3   = ((ck3 .>. fromIntegral sak3) .|. ek3) .&. mask3                             in+  let bk3   = ((qak3 - fk3) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk3   = bk3 .&. mask3                                                               in+  let pbk3  = qak3 - (((ck3 .>. fromIntegral sak3) .|. ek3) .&. mk3)                      in+  let pck3  = pbk3 + ( (ok3 .>. fromIntegral sak3)          .&. mk3)                      in+  let sbk3  = sak3 + (t8k3 .&. bk3)                                                       in++  let qak2  = pck3                                                                        in+  let sak2  = sbk3                                                                        in++  let ek2   = 0xaaaaaaaaaaaaaaaa .&. comp (0xffffffffffffffff .>. fromIntegral sak2)      in+  let fk2   = ((ck2 .>. fromIntegral sak2) .|. ek2) .&. mask2                             in+  let bk2   = ((qak2 - fk2) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk2   = bk2 .&. mask2                                                               in+  let pbk2  = qak2 - (((ck2 .>. fromIntegral sak2) .|. ek2) .&. mk2)                      in+  let pck2  = pbk2 + ( (ok2 .>. fromIntegral sak2)          .&. mk2)                      in+  let sbk2  = sak2 + (t8k2 .&. bk2)                                                       in++  let qak1  = pck2                                                                        in+  let sak1  = sbk2                                                                        in++  let ek1   = 0xaaaaaaaaaaaaaaaa .&. comp (0xffffffffffffffff .>. fromIntegral sak1)      in+  let fk1   = ((ck1 .>. fromIntegral sak1) .|. ek1) .&. mask1                             in+  let bk1   = ((qak1 - fk1) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk1   = bk1  .&. mask1                                                              in+  let pbk1  = qak1 - (((ck1 .>. fromIntegral sak1) .|. ek1) .&. mk1)                      in+  let pck1  = pbk1 + ( (ok1 .>. fromIntegral sak1)          .&. mk1)                      in+  let sbk1  = sak1 + (t8k1 .&. bk1)                                                       in++  let rrr   = sbk1 + pck1 + (((x .>. fromIntegral sbk1) .&. ((pck1 .<. 1) .|. 1)) .<. 1)  in++  rrr + p+{-# INLINE findCloseFar #-}++-- Source:+--    Broadword Implementation of Parenthesis Queries+--    Sebastiano Vigna+--    Dipartimento di Scienze dell’Informazione+--    Università degli Studi di Milano, Italy+findClose :: Word64 -> Word64+findClose x =+  let !b00 = x - ((x .&. 0xaaaaaaaaaaaaaaaa) .>. 1)                                               in+  let !b01 = (b00 .&. 0x3333333333333333) + ((b00 .>. 2) .&. 0x3333333333333333)                  in+  let !b02 = (b01 + (b01 .>. 4)) .&. 0x0f0f0f0f0f0f0f0f                                           in+  let !b03 = (b02 * 0x0101010101010101) .<. 1                                                     in+  let !b04 = kBitDiffUnsafe 8 (h 8 .|. 0x4038302820181008) b03                                    in+  let !u00 = (((((b04 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in+  let !z00 =                         ((h 8 .>. 1) .|. (l 8 * 7)) .&. u00                          in++  let !d10 = (l 8 * 2 - (((x .>. 6) .&. (l 8 .<. 1)) + ((x .>. 5) .&. (l 8 .<. 1))))              in+  let !b10 = b04 - d10                                                                            in+  let !u10 = (((((b10 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in+  let !z10 = (z00 .&. comp u10) .|. (((h 8 .>. 1) .|. (l 8 * 5)) .&. u10)                         in++  let !d20 = (l 8 * 2 - (((x .>. 4) .&. (l 8 .<. 1)) + ((x .>. 3) .&. (l 8 .<. 1))))              in+  let !b20 = b10 - d20                                                                            in+  let !u20 = (((((b20 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in+  let !z20 = (z10 .&. comp u20) .|. (((h 8 .>. 1) .|. (l 8 * 3)) .&. u20)                         in++  let !d30 = (l 8 * 2 - (((x .>. 2) .&. (l 8 .<. 1)) + ((x .>. 1) .&. (l 8 .<. 1))))              in+  let !b30 = b20 - d30                                                                            in+  let !u30 = (((((b30 .|. h 8) - l 8) .>. 7) .&. l 8) .|. h 8) - l 8                              in+  let !z30 = (z20 .&. comp u30) .|. (((h 8 .>. 1) .|.  l 8     ) .&. u30)                         in++  let !p00 = lsb (z30 .>. 6 .&. l 8)                                                              in+  let !r00 = ((p00 + ((z30 .>. fromIntegral (p00 .&. 0x3f)) .&. 0x3f)) .|. (p00 .>. 8)) .&. 0x7f  in+  r00+{-# INLINE findClose #-}
+ src/HaskellWorks/Data/BalancedParens/Broadword/Word8.hs view
@@ -0,0 +1,94 @@+{-# LANGUAGE FlexibleContexts    #-}+{-# LANGUAGE FlexibleInstances   #-}+{-# LANGUAGE InstanceSigs        #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word8+  ( findCloseFar+  ) where++import Data.Int+import Data.Word+import HaskellWorks.Data.Bits.BitWise+import HaskellWorks.Data.Bits.Broadword.Word8++muk1 :: Word8+muk1 = 0x33+{-# INLINE muk1 #-}++muk2 :: Word8+muk2 = 0x0f+{-# INLINE muk2 #-}++findCloseFar :: Word8 -> Word8 -> Word8+findCloseFar p w =+  let x     = w .>. fromIntegral p                                                        in+  let wsz   = 8 :: Int8                                                                   in+  let k1    = 1                                                                           in+  let k2    = 2                                                                           in+  let k3    = 3                                                                           in+  let mask3 = (1 .<. (1 .<. k3)) - 1                                                      in+  let mask2 = (1 .<. (1 .<. k2)) - 1                                                      in+  let mask1 = (1 .<. (1 .<. k1)) - 1                                                      in+  let t64k1 = 1 .<. k1 :: Word64                                                          in+  let t64k2 = 1 .<. k2 :: Word64                                                          in+  let t8k1  = 1 .<. k1 :: Word8                                                           in+  let t8k2  = 1 .<. k2 :: Word8                                                           in+  let t8k3  = 1 .<. k3 :: Word8                                                           in++  let b0    =      x .&. 0x55                                                             in+  let b1    =    ( x .&. 0xaa) .>. 1                                                      in+  let ll    =   (b0  .^. b1  ) .&. b1                                                     in+  let ok1   = ( (b0  .&. b1  )           .<. 1) .|. ll                                    in+  let ck1   = (((b0  .|. b1  ) .^. 0x55) .<. 1) .|. ll                                    in++  let eok1 =   ok1 .&.  muk1                                                              in+  let eck1 =  (ck1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2L =  (ok1 .&. (muk1 .<. t64k1)) .>. t64k1                                        in+  let ok2R = kBitDiffPos 4 eok1 eck1                                                      in+  let ok2  = ok2L + ok2R                                                                  in+  let ck2  =  (ck1 .&.  muk1) + kBitDiffPos 4 eck1 eok1                                   in++  let eok2 =   ok2 .&.  muk2                                                              in+  let eck2 =  (ck2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3L =  (ok2 .&. (muk2 .<. t64k2)) .>. t64k2                                        in+  let ok3R = kBitDiffPos 8 eok2 eck2                                                      in+  let ok3  = ok3L + ok3R                                                                  in+  let ck3  =  (ck2 .&.  muk2) + kBitDiffPos 8 eck2 eok2                                   in++  let pak3  = 0                                                                           in+  let sak3  = 0                                                                           in++  let fk3   = (ck3 .>. fromIntegral sak3) .&. mask3                                       in+  let bk3   = ((pak3 - fk3) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk3   = bk3 .&. mask3                                                               in+  let pbk3  = pak3 - ((ck3 .>. fromIntegral sak3) .&. mk3)                                in+  let pck3  = pbk3 + ((ok3 .>. fromIntegral sak3) .&. mk3)                                in+  let sbk3  = sak3 + (t8k3 .&. bk3)                                                       in++  let pak2  = pck3                                                                        in+  let sak2  = sbk3                                                                        in++  let ek2   = 0xaa .&. comp (0xff .>. fromIntegral sak2)                                  in+  let fk2   = ((ck2 .>. fromIntegral sak2) .|. ek2) .&. mask2                             in+  let bk2   = ((pak2 - fk2) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk2   = bk2 .&. mask2                                                               in+  let pbk2  = pak2 - (((ck2 .>. fromIntegral sak2) .|. ek2) .&. mk2)                      in+  let pck2  = pbk2 + ( (ok2 .>. fromIntegral sak2)          .&. mk2)                      in+  let sbk2  = sak2 + (t8k2 .&. bk2)                                                       in++  let pak1  = pck2                                                                        in+  let sak1  = sbk2                                                                        in++  let ek1   = 0xaa .&. comp (0xff .>. fromIntegral sak1)                                  in+  let fk1   = ((ck1 .>. fromIntegral sak1) .|. ek1) .&. mask1                             in+  let bk1   = ((pak1 - fk1) .>. fromIntegral (wsz - 1)) - 1                               in+  let mk1   = bk1  .&. mask1                                                              in+  let pbk1  = pak1 - (((ck1 .>. fromIntegral sak1) .|. ek1) .&. mk1)                      in+  let pck1  = pbk1 + ( (ok1 .>. fromIntegral sak1)          .&. mk1)                      in+  let sbk1  = sak1 + (t8k1 .&. bk1)                                                       in++  let rrr   = sbk1 + pck1 + (((x .>. fromIntegral sbk1) .&. ((pck1 .<. 1) .|. 1)) .<. 1)  in++  rrr + p+{-# INLINE findCloseFar #-}
src/HaskellWorks/Data/BalancedParens/FindClose.hs view
@@ -5,7 +5,6 @@   ) where  import Data.Word-import HaskellWorks.Data.BalancedParens.Broadword import HaskellWorks.Data.BalancedParens.CloseAt import HaskellWorks.Data.BalancedParens.FindCloseN import HaskellWorks.Data.Bits.BitShown@@ -14,7 +13,8 @@ import HaskellWorks.Data.Naive import HaskellWorks.Data.Positioning -import qualified Data.Vector.Storable as DVS+import qualified Data.Vector.Storable                              as DVS+import qualified HaskellWorks.Data.BalancedParens.Broadword.Word64 as W64  class FindClose v where   findClose   :: v -> Count -> Maybe Count@@ -65,7 +65,7 @@  instance FindClose (Broadword Word64) where   findClose (Broadword w) p = let x = w .>. (p - 1) in-    case negate (x .&. 1) .&. findCloseW64 x of+    case negate (x .&. 1) .&. W64.findClose x of       127 -> Nothing       r   -> let r' = fromIntegral r + p in if r' > 64 then Nothing else Just r'   {-# INLINE findClose #-}
src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq.hs view
@@ -22,8 +22,6 @@  import Control.DeepSeq import Data.Int-import Data.Monoid                                (Monoid)-import Data.Semigroup                             (Semigroup (..)) import Data.Word import GHC.Generics import HaskellWorks.Data.Bits.BitWise
+ src/HaskellWorks/Data/BalancedParens/Internal/Show.hs view
@@ -0,0 +1,6 @@+module HaskellWorks.Data.BalancedParens.Internal.Show+  ( showPadded+  ) where++showPadded :: Show a => Int -> a -> String+showPadded n a = reverse (take n (reverse (show a) ++ [' ', ' ' ..]))
+ src/HaskellWorks/Data/BalancedParens/Internal/Slow/Word16.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE LambdaCase #-}++module HaskellWorks.Data.BalancedParens.Internal.Slow.Word16+  ( findCloseFar+  ) where++import Data.Word+import HaskellWorks.Data.Bits.BitWise++findCloseFar :: Word16 -> Word16 -> Word16+findCloseFar = go 0+  where go :: Word16 -> Word16 -> Word16 -> Word16+        go d 16 _ = 16 + d+        go d i w = case (w .>. fromIntegral i) .&. 1 of+          1 -> go (d + 1) (i + 1) w+          _ -> if d == 0+            then i+            else go (d - 1) (i + 1) w
+ src/HaskellWorks/Data/BalancedParens/Internal/Slow/Word32.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE LambdaCase #-}++module HaskellWorks.Data.BalancedParens.Internal.Slow.Word32+  ( findCloseFar+  ) where++import Data.Word+import HaskellWorks.Data.Bits.BitWise++findCloseFar :: Word32 -> Word32 -> Word32+findCloseFar = go 0+  where go :: Word32 -> Word32 -> Word32 -> Word32+        go d 32 _ = 32 + d+        go d i w = case (w .>. fromIntegral i) .&. 1 of+          1 -> go (d + 1) (i + 1) w+          _ -> if d == 0+            then i+            else go (d - 1) (i + 1) w
+ src/HaskellWorks/Data/BalancedParens/Internal/Slow/Word64.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE LambdaCase #-}++module HaskellWorks.Data.BalancedParens.Internal.Slow.Word64+  ( findCloseFar+  ) where++import Data.Word+import HaskellWorks.Data.Bits.BitWise++findCloseFar :: Word64 -> Word64 -> Word64+findCloseFar = go 0+  where go :: Word64 -> Word64 -> Word64 -> Word64+        go d 64 _ = 64 + d+        go d i w = case (w .>. fromIntegral i) .&. 1 of+          1 -> go (d + 1) (i + 1) w+          _ -> if d == 0+            then i+            else go (d - 1) (i + 1) w
+ src/HaskellWorks/Data/BalancedParens/Internal/Slow/Word8.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE LambdaCase #-}++module HaskellWorks.Data.BalancedParens.Internal.Slow.Word8+  ( findCloseFar+  ) where++import Data.Word+import HaskellWorks.Data.Bits.BitWise++findCloseFar :: Word8 -> Word8 -> Word8+findCloseFar = go 0+  where go :: Word8 -> Word8 -> Word8 -> Word8+        go d 8 _ = 8 + d+        go d i w = case (w .>. fromIntegral i) .&. 1 of+          1 -> go (d + 1) (i + 1) w+          _ -> if d == 0+            then i+            else go (d - 1) (i + 1) w
src/HaskellWorks/Data/BalancedParens/Internal/Trace.hs view
@@ -2,7 +2,6 @@   ( traceW   ) where -import Data.Semigroup ((<>)) import Debug.Trace  traceW :: Show a => String -> a -> a
+ src/HaskellWorks/Data/BalancedParens/Internal/Word16.hs view
@@ -0,0 +1,34 @@+module HaskellWorks.Data.BalancedParens.Internal.Word16+  ( mu0+  , mu1+  , mu2+  , mu3+  , mu4+  ) where++import Data.Word++-- | Subwords of size 2 ^ 0 alternating between all bits cleared and all bits+mu0 :: Word16+mu0 = 0x5555+{-# INLINE mu0 #-}++-- | Subwords of size 2 ^ 1 alternating between all bits cleared and all bits+mu1 :: Word16+mu1 = 0x3333+{-# INLINE mu1 #-}++-- | Subwords of size 2 ^ 2 alternating between all bits cleared and all bits+mu2 :: Word16+mu2 = 0x0f0f+{-# INLINE mu2 #-}++-- | Subwords of size 2 ^ 3 alternating between all bits cleared and all bits+mu3 :: Word16+mu3 = 0x00ff+{-# INLINE mu3 #-}++-- | Subwords of size 2 ^ 4 alternating between all bits cleared and all bits+mu4 :: Word16+mu4 = 0xffff+{-# INLINE mu4 #-}
+ src/HaskellWorks/Data/BalancedParens/Internal/Word32.hs view
@@ -0,0 +1,40 @@+module HaskellWorks.Data.BalancedParens.Internal.Word32+  ( mu0+  , mu1+  , mu2+  , mu3+  , mu4+  , mu5+  ) where++import Data.Word++-- | Subwords of size 2 ^ 0 alternating between all bits cleared and all bits+mu0 :: Word32+mu0 = 0x55555555+{-# INLINE mu0 #-}++-- | Subwords of size 2 ^ 1 alternating between all bits cleared and all bits+mu1 :: Word32+mu1 = 0x33333333+{-# INLINE mu1 #-}++-- | Subwords of size 2 ^ 2 alternating between all bits cleared and all bits+mu2 :: Word32+mu2 = 0x0f0f0f0f+{-# INLINE mu2 #-}++-- | Subwords of size 2 ^ 3 alternating between all bits cleared and all bits+mu3 :: Word32+mu3 = 0x00ff00ff+{-# INLINE mu3 #-}++-- | Subwords of size 2 ^ 4 alternating between all bits cleared and all bits+mu4 :: Word32+mu4 = 0x0000ffff+{-# INLINE mu4 #-}++-- | Subwords of size 2 ^ 5 alternating between all bits cleared and all bits+mu5 :: Word32+mu5 = 0xffffffff+{-# INLINE mu5 #-}
+ src/HaskellWorks/Data/BalancedParens/Internal/Word64.hs view
@@ -0,0 +1,46 @@+module HaskellWorks.Data.BalancedParens.Internal.Word64+  ( mu0+  , mu1+  , mu2+  , mu3+  , mu4+  , mu5+  , mu6+  ) where++import Data.Word++-- | Subwords of size 2 ^ 0 alternating between all bits cleared and all bits+mu0 :: Word64+mu0 = 0x5555555555555555+{-# INLINE mu0 #-}++-- | Subwords of size 2 ^ 1 alternating between all bits cleared and all bits+mu1 :: Word64+mu1 = 0x3333333333333333+{-# INLINE mu1 #-}++-- | Subwords of size 2 ^ 2 alternating between all bits cleared and all bits+mu2 :: Word64+mu2 = 0x0f0f0f0f0f0f0f0f+{-# INLINE mu2 #-}++-- | Subwords of size 2 ^ 3 alternating between all bits cleared and all bits+mu3 :: Word64+mu3 = 0x00ff00ff00ff00ff+{-# INLINE mu3 #-}++-- | Subwords of size 2 ^ 4 alternating between all bits cleared and all bits+mu4 :: Word64+mu4 = 0x0000ffff0000ffff+{-# INLINE mu4 #-}++-- | Subwords of size 2 ^ 5 alternating between all bits cleared and all bits+mu5 :: Word64+mu5 = 0x00000000ffffffff+{-# INLINE mu5 #-}++-- | Subwords of size 2 ^ 6 alternating between all bits cleared and all bits+mu6 :: Word64+mu6 = 0xffffffffffffffff+{-# INLINE mu6 #-}
+ src/HaskellWorks/Data/BalancedParens/Internal/Word8.hs view
@@ -0,0 +1,28 @@+module HaskellWorks.Data.BalancedParens.Internal.Word8+  ( mu0+  , mu1+  , mu2+  , mu3+  ) where++import Data.Word++-- | Subwords of size 2 ^ 0 alternating between all bits cleared and all bits+mu0 :: Word16+mu0 = 0x55+{-# INLINE mu0 #-}++-- | Subwords of size 2 ^ 1 alternating between all bits cleared and all bits+mu1 :: Word16+mu1 = 0x33+{-# INLINE mu1 #-}++-- | Subwords of size 2 ^ 2 alternating between all bits cleared and all bits+mu2 :: Word16+mu2 = 0x0f+{-# INLINE mu2 #-}++-- | Subwords of size 2 ^ 3 alternating between all bits cleared and all bits+mu3 :: Word16+mu3 = 0xff+{-# INLINE mu3 #-}
src/HaskellWorks/Data/BalancedParens/ParensSeq.hs view
@@ -21,7 +21,6 @@  import Data.Coerce import Data.Foldable-import Data.Monoid import Data.Word import HaskellWorks.Data.BalancedParens.Internal.ParensSeq (Elem (Elem), ParensSeq (ParensSeq), ParensSeqFt) import HaskellWorks.Data.Bits.BitWise
+ test/HaskellWorks/Data/BalancedParens/Broadword/Word16Spec.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word16Spec where++import Data.Maybe+import HaskellWorks.Data.Bits.BitRead+import HaskellWorks.Data.Bits.BitShow+import HaskellWorks.Hspec.Hedgehog+import Hedgehog+import Numeric+import Test.Hspec++import qualified HaskellWorks.Data.BalancedParens.Broadword.Word16     as W16+import qualified HaskellWorks.Data.BalancedParens.Internal.Slow.Word16 as SW16+import qualified Hedgehog.Gen                                          as G+import qualified Hedgehog.Range                                        as R++{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}+{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}++spec :: Spec+spec = describe "HaskellWorks.Data.BalancedParens.Broadword.Word16Spec" $ do+  it "findCloseFar 0 [11111111 11110100]" $ requireTest $ do+    p <- forAll $ pure 0+    w <- forAll $ pure $ fromJust $ bitRead "11111111 11110100"+    annotateShow $ bitShow w+    annotateShow $ showHex w ""+    W16.findCloseFar p w === SW16.findCloseFar p w++  it "findCloseFar" $ require $ withTests 1000 $ property $ do+    p <- forAll $ G.word16 (R.linear 0 16)+    w <- forAll $ G.word16 R.constantBounded+    annotateShow $ bitShow w+    W16.findCloseFar p w === SW16.findCloseFar p w
+ test/HaskellWorks/Data/BalancedParens/Broadword/Word32Spec.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word32Spec where++import HaskellWorks.Data.Bits.BitShow+import HaskellWorks.Hspec.Hedgehog+import Hedgehog+import Test.Hspec++import qualified HaskellWorks.Data.BalancedParens.Broadword.Word32     as W32+import qualified HaskellWorks.Data.BalancedParens.Internal.Slow.Word32 as SW32+import qualified Hedgehog.Gen                                          as G+import qualified Hedgehog.Range                                        as R++{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}+{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}++spec :: Spec+spec = describe "HaskellWorks.Data.BalancedParens.Broadword.Word32Spec" $ do+  it "findCloseFar" $ requireTest $ do+    p <- forAll $ pure 0+    w <- forAll $ pure 0xe9f6e7ff+    annotateShow $ bitShow w+    W32.findCloseFar p w === SW32.findCloseFar p w+  it "findCloseFar" $ require $ withTests 10000 $ property $ do+    p <- forAll $ G.word32 (R.linear 0 32)+    w <- forAll $ G.word32 R.constantBounded+    annotateShow $ bitShow w+    W32.findCloseFar p w === SW32.findCloseFar p w
+ test/HaskellWorks/Data/BalancedParens/Broadword/Word64Spec.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word64Spec where++import HaskellWorks.Data.Bits.BitShow+import HaskellWorks.Hspec.Hedgehog+import Hedgehog+import Test.Hspec++import qualified HaskellWorks.Data.BalancedParens.Broadword.Word64     as W64+import qualified HaskellWorks.Data.BalancedParens.Internal.Slow.Word64 as SW64+import qualified Hedgehog.Gen                                          as G+import qualified Hedgehog.Range                                        as R++{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}+{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}++spec :: Spec+spec = describe "HaskellWorks.Data.BalancedParens.Broadword.Word64Spec" $ do+  it "findCloseFar" $ require $ withTests 100000 $ property $ do+    p <- forAll $ G.word64 (R.linear 0 64)+    w <- forAll $ G.word64 R.constantBounded+    annotateShow $ bitShow w+    W64.findCloseFar p w === SW64.findCloseFar p w
+ test/HaskellWorks/Data/BalancedParens/Broadword/Word8Spec.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}++module HaskellWorks.Data.BalancedParens.Broadword.Word8Spec where++import Control.Monad+import HaskellWorks.Data.Bits.BitShow+import HaskellWorks.Hspec.Hedgehog+import Hedgehog+import Test.Hspec++import qualified HaskellWorks.Data.BalancedParens.Broadword.Word8     as W8+import qualified HaskellWorks.Data.BalancedParens.Internal.Slow.Word8 as SW8++{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}+{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}++spec :: Spec+spec = describe "HaskellWorks.Data.BalancedParens.Broadword.Word8Spec" $ do+  describe "findCloseFar" $ do+    forM_ [0 .. 8] $ \p0 -> do+      forM_ [0 .. 0xff] $ \w0 -> do+        it ("word " <> bitShow w0) $ requireTest $ do+          p <- forAll $ pure p0+          w <- forAll $ pure w0+          W8.findCloseFar p w === SW8.findCloseFar p w
test/HaskellWorks/Data/BalancedParens/Internal/ParensSeqSpec.hs view
@@ -4,7 +4,6 @@  module HaskellWorks.Data.BalancedParens.Internal.ParensSeqSpec where -import Data.Semigroup                             ((<>)) import HaskellWorks.Data.BalancedParens.ParensSeq ((<|), (><), (|>)) import HaskellWorks.Data.RankSelect.Base.Select1 import HaskellWorks.Hspec.Hedgehog