hw-balancedparens 0.2.1.0 → 0.2.2.0
raw patch · 9 files changed
+277/−277 lines, 9 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: (<|) :: Cons v => Elem v -> v -> v
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: (><) :: (Semigroup v, Container v) => v -> v -> v
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: (|>) :: Snoc v => v -> Elem v -> v
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: drop :: Count -> ParensSeq -> ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: firstChild :: ParensSeq -> Count -> Maybe Count
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: fromBools :: [Bool] -> ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: fromPartialWord64s :: Traversable f => f (Word64, Count) -> ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: fromWord64s :: Traversable f => f Word64 -> ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: infixl 5 |>
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: infixr 5 ><
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: mempty :: Monoid a => a
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: nextSibling :: ParensSeq -> Count -> Maybe Count
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: size :: ParensSeq -> Count
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: splitAt :: Count -> ParensSeq -> (ParensSeq, ParensSeq)
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: take :: Count -> ParensSeq -> ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: toBools :: ParensSeq -> [Bool]
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq: toPartialWord64s :: ParensSeq -> [(Word64, Count)]
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: (#<|) :: Elem -> ParensSeqFt -> ParensSeqFt
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: (|>#) :: ParensSeqFt -> Elem -> ParensSeqFt
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: Elem :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !Count -> Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: Measure :: {-# UNPACK #-} !Count -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: ParensSeq :: ParensSeqFt -> ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: [$sel:bps:Elem] :: Elem -> {-# UNPACK #-} !Word64
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: [$sel:excess:Measure] :: Measure -> {-# UNPACK #-} !Int
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: [$sel:min:Measure] :: Measure -> {-# UNPACK #-} !Int
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: [$sel:parens:ParensSeq] :: ParensSeq -> ParensSeqFt
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: [$sel:size:Elem] :: Elem -> {-# UNPACK #-} !Count
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: [$sel:size:Measure] :: Measure -> {-# UNPACK #-} !Count
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: atMinZero :: Measure -> Bool
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: atSizeBelowZero :: Count -> Measure -> Bool
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: data Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: data Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: ftSplit :: (Measure -> Bool) -> ParensSeqFt -> (ParensSeqFt, ParensSeqFt)
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance Control.DeepSeq.NFData HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance Control.DeepSeq.NFData HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance Control.DeepSeq.NFData HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Base.Monoid HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Base.Semigroup HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Base.Semigroup HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Classes.Eq HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Classes.Eq HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Classes.Ord HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Generics.Generic HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Generics.Generic HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Generics.Generic HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Show.Show HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Show.Show HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance GHC.Show.Show HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance HaskellWorks.Data.Cons.Cons HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance HaskellWorks.Data.Container.Container HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance HaskellWorks.Data.FingerTree.Measured HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Measure HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: instance HaskellWorks.Data.Snoc.Snoc HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal.ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: newtype ParensSeq
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal: type ParensSeqFt = FingerTree Measure Elem
- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Types: data ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: (#<|) :: Elem -> ParensSeqFt -> ParensSeqFt
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: (|>#) :: ParensSeqFt -> Elem -> ParensSeqFt
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: Elem :: {-# UNPACK #-} !Word64 -> {-# UNPACK #-} !Count -> Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: Measure :: {-# UNPACK #-} !Count -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: [$sel:bps:Elem] :: Elem -> {-# UNPACK #-} !Word64
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: [$sel:excess:Measure] :: Measure -> {-# UNPACK #-} !Int
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: [$sel:min:Measure] :: Measure -> {-# UNPACK #-} !Int
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: [$sel:size:Elem] :: Elem -> {-# UNPACK #-} !Count
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: [$sel:size:Measure] :: Measure -> {-# UNPACK #-} !Count
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: atMinZero :: Measure -> Bool
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: atSizeBelowZero :: Count -> Measure -> Bool
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: data Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: data Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: ftSplit :: (Measure -> Bool) -> ParensSeqFt -> (ParensSeqFt, ParensSeqFt)
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance Control.DeepSeq.NFData HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance Control.DeepSeq.NFData HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance Control.DeepSeq.NFData HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Base.Monoid HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Base.Semigroup HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Base.Semigroup HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Classes.Eq HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Classes.Eq HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Classes.Ord HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Generics.Generic HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Generics.Generic HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Generics.Generic HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Show.Show HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Show.Show HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance GHC.Show.Show HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance HaskellWorks.Data.Cons.Cons HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance HaskellWorks.Data.Container.Container HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance HaskellWorks.Data.FingerTree.Measured HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Measure HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Elem
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: instance HaskellWorks.Data.Snoc.Snoc HaskellWorks.Data.BalancedParens.Internal.ParensSeq.ParensSeq
+ HaskellWorks.Data.BalancedParens.Internal.ParensSeq: type ParensSeqFt = FingerTree Measure Elem
+ HaskellWorks.Data.BalancedParens.ParensSeq: (<|) :: Cons v => Elem v -> v -> v
+ HaskellWorks.Data.BalancedParens.ParensSeq: (><) :: (Semigroup v, Container v) => v -> v -> v
+ HaskellWorks.Data.BalancedParens.ParensSeq: (|>) :: Snoc v => v -> Elem v -> v
+ HaskellWorks.Data.BalancedParens.ParensSeq: ParensSeq :: ParensSeqFt -> ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: [$sel:parens:ParensSeq] :: ParensSeq -> ParensSeqFt
+ HaskellWorks.Data.BalancedParens.ParensSeq: drop :: Count -> ParensSeq -> ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: firstChild :: ParensSeq -> Count -> Maybe Count
+ HaskellWorks.Data.BalancedParens.ParensSeq: fromBools :: [Bool] -> ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: fromPartialWord64s :: Traversable f => f (Word64, Count) -> ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: fromWord64s :: Traversable f => f Word64 -> ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: infixl 5 |>
+ HaskellWorks.Data.BalancedParens.ParensSeq: infixr 5 ><
+ HaskellWorks.Data.BalancedParens.ParensSeq: mempty :: Monoid a => a
+ HaskellWorks.Data.BalancedParens.ParensSeq: newtype ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: nextSibling :: ParensSeq -> Count -> Maybe Count
+ HaskellWorks.Data.BalancedParens.ParensSeq: size :: ParensSeq -> Count
+ HaskellWorks.Data.BalancedParens.ParensSeq: splitAt :: Count -> ParensSeq -> (ParensSeq, ParensSeq)
+ HaskellWorks.Data.BalancedParens.ParensSeq: take :: Count -> ParensSeq -> ParensSeq
+ HaskellWorks.Data.BalancedParens.ParensSeq: toBools :: ParensSeq -> [Bool]
+ HaskellWorks.Data.BalancedParens.ParensSeq: toPartialWord64s :: ParensSeq -> [(Word64, Count)]
+ HaskellWorks.Data.BalancedParens.ParensSeq.Types: data ParensSeq
Files
- bench/Main.hs +7/−7
- gen/HaskellWorks/Data/BalancedParens/Gen.hs +9/−9
- hw-balancedparens.cabal +3/−3
- src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq.hs +106/−118
- src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq/Internal.hs +0/−127
- src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq/Types.hs +0/−5
- src/HaskellWorks/Data/BalancedParens/ParensSeq.hs +139/−0
- src/HaskellWorks/Data/BalancedParens/ParensSeq/Types.hs +5/−0
- test/HaskellWorks/Data/BalancedParens/Internal/ParensSeqSpec.hs +8/−8
bench/Main.hs view
@@ -11,13 +11,13 @@ 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.Internal.ParensSeq as PS-import qualified HaskellWorks.Data.BalancedParens.RangeMinMax as RMM-import qualified HaskellWorks.Data.BalancedParens.RangeMinMax2 as RMM2-import qualified Hedgehog.Gen as G-import qualified Hedgehog.Range as R+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.RangeMinMax as RMM+import qualified HaskellWorks.Data.BalancedParens.RangeMinMax2 as RMM2+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]))
gen/HaskellWorks/Data/BalancedParens/Gen.hs view
@@ -14,19 +14,19 @@ ) where import Data.Coerce-import Data.Semigroup ((<>))+import Data.Semigroup ((<>)) import Data.Word-import HaskellWorks.Data.BalancedParens.Internal.ParensSeq (ParensSeq)+import HaskellWorks.Data.BalancedParens.ParensSeq (ParensSeq) import HaskellWorks.Data.Positioning import Hedgehog -import qualified Data.Vector as DV-import qualified Data.Vector.Storable as DVS-import qualified HaskellWorks.Data.BalancedParens.Internal.ParensSeq as PS-import qualified HaskellWorks.Data.BalancedParens.RangeMinMax as RMM-import qualified HaskellWorks.Data.BalancedParens.RangeMinMax2 as RMM2-import qualified Hedgehog.Gen as G-import qualified Hedgehog.Range as R+import qualified Data.Vector as DV+import qualified Data.Vector.Storable as DVS+import qualified HaskellWorks.Data.BalancedParens.ParensSeq as PS+import qualified HaskellWorks.Data.BalancedParens.RangeMinMax as RMM+import qualified HaskellWorks.Data.BalancedParens.RangeMinMax2 as RMM2+import qualified Hedgehog.Gen as G+import qualified Hedgehog.Range as R count :: MonadGen m => Range Count -> m Count count r = coerce <$> G.word64 (coerce <$> r)
hw-balancedparens.cabal view
@@ -1,7 +1,7 @@ cabal-version: 2.2 name: hw-balancedparens-version: 0.2.1.0+version: 0.2.2.0 synopsis: Balanced parentheses description: Balanced parentheses. category: Data, Bit, Succinct Data Structures, Data Structures@@ -61,13 +61,13 @@ HaskellWorks.Data.BalancedParens.FindOpenN HaskellWorks.Data.BalancedParens.Internal.List HaskellWorks.Data.BalancedParens.Internal.ParensSeq- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal- HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Types HaskellWorks.Data.BalancedParens.Internal.RoseTree HaskellWorks.Data.BalancedParens.Internal.Word HaskellWorks.Data.BalancedParens.NewCloseAt HaskellWorks.Data.BalancedParens.NewOpenAt HaskellWorks.Data.BalancedParens.OpenAt+ HaskellWorks.Data.BalancedParens.ParensSeq+ HaskellWorks.Data.BalancedParens.ParensSeq.Types HaskellWorks.Data.BalancedParens.RangeMinMax HaskellWorks.Data.BalancedParens.RangeMinMax2 HaskellWorks.Data.BalancedParens.Simple
src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq.hs view
@@ -1,139 +1,127 @@-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-} module HaskellWorks.Data.BalancedParens.Internal.ParensSeq- ( ParensSeq(..)- , mempty- , size- , fromWord64s- , fromPartialWord64s- , toPartialWord64s- , fromBools- , toBools- , splitAt- , take- , drop- , firstChild- , nextSibling- , (<|), (><), (|>)+ ( Elem(..)+ , Measure(..)+ , ParensSeq(..)+ , ParensSeqFt+ , (|>#)+ , (#<|)+ , ftSplit+ , atSizeBelowZero+ , atMinZero ) where -import Data.Coerce-import Data.Foldable-import Data.Monoid+import Control.DeepSeq+import Data.Int+import Data.Monoid (Monoid)+import Data.Semigroup (Semigroup (..)) import Data.Word-import HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal (Elem (Elem), ParensSeq (ParensSeq), ParensSeqFt)+import GHC.Generics import HaskellWorks.Data.Bits.BitWise-import HaskellWorks.Data.FingerTree (ViewL (..), ViewR (..), (<|), (><), (|>))+import HaskellWorks.Data.Excess.MinExcess+import HaskellWorks.Data.Excess.PartialMinExcess1+import HaskellWorks.Data.FingerTree (ViewL (..), ViewR (..), (<|), (><), (|>)) import HaskellWorks.Data.Positioning-import Prelude hiding (drop, max, min, splitAt, take)+import Prelude hiding (max, min) -import qualified Data.List as L-import qualified HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal as T-import qualified HaskellWorks.Data.BalancedParens.Internal.Word as W-import qualified HaskellWorks.Data.FingerTree as FT+import qualified HaskellWorks.Data.Cons as HW+import qualified HaskellWorks.Data.Container as HW+import qualified HaskellWorks.Data.FingerTree as FT+import qualified HaskellWorks.Data.Snoc as HW+import qualified Prelude as P -empty :: ParensSeq-empty = ParensSeq FT.empty+data Elem = Elem+ { bps :: {-# UNPACK #-} !Word64+ , size :: {-# UNPACK #-} !Count+ } deriving (Eq, Show, Generic) -size :: ParensSeq -> Count-size (ParensSeq parens) = T.size (FT.measure parens :: T.Measure)+instance NFData Elem --- TODO Needs optimisation-fromWord64s :: Traversable f => f Word64 -> ParensSeq-fromWord64s = foldl go empty- where go :: ParensSeq -> Word64 -> ParensSeq- go ps w = ParensSeq (T.parens ps |> Elem w 64)+data Measure = Measure+ { size :: {-# UNPACK #-} !Count+ , min :: {-# UNPACK #-} !Int+ , excess :: {-# UNPACK #-} !Int+ } deriving (Eq, Ord, Show, Generic) --- TODO Needs optimisation-fromPartialWord64s :: Traversable f => f (Word64, Count) -> ParensSeq-fromPartialWord64s = foldl go empty- where go :: ParensSeq -> (Word64, Count) -> ParensSeq- go ps (w, n) = ParensSeq (T.parens ps |> Elem w n)+instance NFData Measure -toPartialWord64s :: ParensSeq -> [(Word64, Count)]-toPartialWord64s = L.unfoldr go . coerce- where go :: ParensSeqFt -> Maybe ((Word64, Count), ParensSeqFt)- go ft = case FT.viewl ft of- T.Elem w n :< rt -> Just ((w, coerce n), rt)- FT.EmptyL -> Nothing+type ParensSeqFt = FT.FingerTree Measure Elem -fromBools :: [Bool] -> ParensSeq-fromBools = go empty- where go :: ParensSeq -> [Bool] -> ParensSeq- go (ParensSeq ps) (b:bs) = case FT.viewr ps of- FT.EmptyR -> go (ParensSeq (FT.singleton (Elem b' 1))) bs- lt :> Elem w n ->- let newPs = if n >= 64- then ps |> Elem b' 1- else lt |> Elem (w .|. (b' .<. fromIntegral n)) (n + 1)- in go (ParensSeq newPs) bs- where b' = if b then 1 else 0 :: Word64- go ps [] = ps+newtype ParensSeq = ParensSeq+ { parens :: ParensSeqFt+ } deriving (Show, NFData, Generic) -toBools :: ParensSeq -> [Bool]-toBools ps = toBoolsDiff ps []+instance Semigroup Measure where+ Measure aSize aMin aExcess <> Measure bSize bMin bExcess = Measure+ { size = aSize + bSize+ , min = P.min aMin (bMin + aExcess)+ , excess = aExcess + bExcess+ } -toBoolsDiff :: ParensSeq -> [Bool] -> [Bool]-toBoolsDiff ps = mconcat (fmap go (toPartialWord64s ps))- where go :: (Word64, Count) -> [Bool] -> [Bool]- go (w, n) = W.partialToBoolsDiff (fromIntegral n) w+instance Monoid Measure where+ mempty = Measure 0 0 0 -drop :: Count -> ParensSeq -> ParensSeq-drop n ps = snd (splitAt n ps)+instance FT.Measured Measure Elem where+ measure (Elem w size) = Measure { min, excess, size }+ where MinExcess min excess = partialMinExcess1 (fromIntegral size) w -take :: Count -> ParensSeq -> ParensSeq-take n ps = fst (splitAt n ps)+instance HW.Container ParensSeq where+ type Elem ParensSeq = Bool -splitAt :: Count -> ParensSeq -> (ParensSeq, ParensSeq)-splitAt n (ParensSeq parens) = case FT.split (T.atSizeBelowZero n) parens of- (lt, rt) -> let- n' = n - T.size (FT.measure lt :: T.Measure)- u = 64 - n'- in case FT.viewl rt of- T.Elem w nw :< rrt -> if n' >= nw- then (ParensSeq lt , ParensSeq rrt )- else (ParensSeq (lt |> T.Elem ((w .<. u) .>. u) n'), ParensSeq (T.Elem (w .>. n') (nw - n') <| rrt))- FT.EmptyL -> (ParensSeq lt, ParensSeq FT.empty)+instance HW.Cons ParensSeq where+ cons b (ParensSeq ft) = ParensSeq $ case FT.viewl ft of+ Elem w nw :< rt -> if nw >= 0 && nw < 64+ then Elem ((w .<. 1) .|. bw) (nw + 1) <| rt+ else Elem bw 1 <| ft+ FT.EmptyL -> FT.singleton (Elem bw 1)+ where bw = if b then 1 else 0 -firstChild :: ParensSeq -> Count -> Maybe Count-firstChild ps n = case FT.viewl ft of- T.Elem w nw :< rt -> if nw >= 2- then case w .&. 3 of- 3 -> Just (n + 1)- _ -> Nothing- else if nw >= 1- then case w .&. 1 of- 1 -> case FT.viewl rt of- T.Elem w' nw' :< _ -> if nw' >= 1- then case w' .&. 1 of- 1 -> Just (n + 1)- _ -> Nothing- else Nothing- FT.EmptyL -> Nothing- _ -> Nothing- else Nothing- FT.EmptyL -> Nothing- where ParensSeq ft = drop (n - 1) ps+instance HW.Snoc ParensSeq where+ snoc (ParensSeq ft) b = ParensSeq $ case FT.viewr ft of+ lt :> Elem w nw -> if nw >= 0 && nw < 64+ then Elem (w .|. (bw .<. nw)) (nw + 1) <| lt+ else Elem bw 1 <| lt+ FT.EmptyR -> FT.singleton (Elem bw 1)+ where bw = if b then 1 else 0 -nextSibling :: ParensSeq -> Count -> Maybe Count-nextSibling (ParensSeq ps) n = do- let (lt0, rt0) = T.ftSplit (T.atSizeBelowZero (n - 1)) ps- _ <- case FT.viewl rt0 of- T.Elem w nw :< _ -> if nw >= 1 && w .&. 1 == 1 then Just () else Nothing- FT.EmptyL -> Nothing- let (lt1, rt1) = T.ftSplit (T.atSizeBelowZero 1) rt0- let (lt2, rt2) = T.ftSplit T.atMinZero rt1- case FT.viewl rt2 of- T.Elem w nw :< _ -> if nw >= 1 && w .&. 1 == 0 then Just () else Nothing- FT.EmptyL -> Nothing- let (lt3, rt3) = T.ftSplit (T.atSizeBelowZero 1) rt2- case FT.viewl rt3 of- T.Elem w nw :< _ -> if nw >= 1 && w .&. 1 == 1 then Just () else Nothing- FT.EmptyL -> Nothing- return $ 1- + T.size (FT.measure lt0 :: T.Measure)- + T.size (FT.measure lt1 :: T.Measure)- + T.size (FT.measure lt2 :: T.Measure)- + T.size (FT.measure lt3 :: T.Measure)+instance Semigroup ParensSeq where+ ParensSeq tl <> ParensSeq tr = ParensSeq $ case FT.viewr tl of+ tll :> Elem wl nwl -> case FT.viewl tr of+ Elem wr nwr :< trr -> let nw = nwl + nwr in if nw <= 64+ then (tll |> Elem (wl .|. (wr .<. nwl)) nw) >< trr+ else tl >< tr+ FT.EmptyL -> tr+ FT.EmptyR -> FT.empty++(|>#) :: ParensSeqFt -> Elem -> ParensSeqFt+(|>#) ft e@(Elem _ wn) = if wn > 0 then ft |> e else ft++(#<|) :: Elem ->ParensSeqFt -> ParensSeqFt+(#<|) e@(Elem _ wn) ft = if wn > 0 then e <| ft else ft++ftSplit :: (Measure -> Bool) -> ParensSeqFt -> (ParensSeqFt, ParensSeqFt)+ftSplit p ft = case FT.viewl rt of+ Elem w nw :< rrt -> let c = go w nw nw in (lt |># Elem w c, Elem (w .>. c) (nw - c) #<| rrt)+ FT.EmptyL -> (ft, FT.empty)+ where (lt, rt) = FT.split p ft+ ltm = FT.measure lt+ go :: Word64 -> Count -> Count -> Count+ go w c nw = if c > 0+ then if p (ltm <> FT.measure (Elem (w .<. (64 - c) .>. (64 - c)) c))+ then go w (c - 1) nw+ else c+ else 0++atSizeBelowZero :: Count -> Measure -> Bool+atSizeBelowZero n m = n < size (m :: Measure)++atMinZero :: Measure -> Bool+atMinZero m = min (m :: Measure) <= 0
− src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq/Internal.hs
@@ -1,127 +0,0 @@-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE TypeFamilies #-}--module HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal- ( Elem(..)- , Measure(..)- , ParensSeq(..)- , ParensSeqFt- , (|>#)- , (#<|)- , ftSplit- , atSizeBelowZero- , atMinZero- ) where--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-import HaskellWorks.Data.Excess.MinExcess-import HaskellWorks.Data.Excess.PartialMinExcess1-import HaskellWorks.Data.FingerTree (ViewL (..), ViewR (..), (<|), (><), (|>))-import HaskellWorks.Data.Positioning-import Prelude hiding (max, min)--import qualified HaskellWorks.Data.Cons as HW-import qualified HaskellWorks.Data.Container as HW-import qualified HaskellWorks.Data.FingerTree as FT-import qualified HaskellWorks.Data.Snoc as HW-import qualified Prelude as P--data Elem = Elem- { bps :: {-# UNPACK #-} !Word64- , size :: {-# UNPACK #-} !Count- } deriving (Eq, Show, Generic)--instance NFData Elem--data Measure = Measure- { size :: {-# UNPACK #-} !Count- , min :: {-# UNPACK #-} !Int- , excess :: {-# UNPACK #-} !Int- } deriving (Eq, Ord, Show, Generic)--instance NFData Measure--type ParensSeqFt = FT.FingerTree Measure Elem--newtype ParensSeq = ParensSeq- { parens :: ParensSeqFt- } deriving (Show, NFData, Generic)--instance Semigroup Measure where- Measure aSize aMin aExcess <> Measure bSize bMin bExcess = Measure- { size = aSize + bSize- , min = P.min aMin (bMin + aExcess)- , excess = aExcess + bExcess- }--instance Monoid Measure where- mempty = Measure 0 0 0--instance FT.Measured Measure Elem where- measure (Elem w size) = Measure { min, excess, size }- where MinExcess min excess = partialMinExcess1 (fromIntegral size) w--instance HW.Container ParensSeq where- type Elem ParensSeq = Bool--instance HW.Cons ParensSeq where- cons b (ParensSeq ft) = ParensSeq $ case FT.viewl ft of- Elem w nw :< rt -> if nw >= 0 && nw < 64- then Elem ((w .<. 1) .|. bw) (nw + 1) <| rt- else Elem bw 1 <| ft- FT.EmptyL -> FT.singleton (Elem bw 1)- where bw = if b then 1 else 0--instance HW.Snoc ParensSeq where- snoc (ParensSeq ft) b = ParensSeq $ case FT.viewr ft of- lt :> Elem w nw -> if nw >= 0 && nw < 64- then Elem (w .|. (bw .<. nw)) (nw + 1) <| lt- else Elem bw 1 <| lt- FT.EmptyR -> FT.singleton (Elem bw 1)- where bw = if b then 1 else 0--instance Semigroup ParensSeq where- ParensSeq tl <> ParensSeq tr = ParensSeq $ case FT.viewr tl of- tll :> Elem wl nwl -> case FT.viewl tr of- Elem wr nwr :< trr -> let nw = nwl + nwr in if nw <= 64- then (tll |> Elem (wl .|. (wr .<. nwl)) nw) >< trr- else tl >< tr- FT.EmptyL -> tr- FT.EmptyR -> FT.empty--(|>#) :: ParensSeqFt -> Elem -> ParensSeqFt-(|>#) ft e@(Elem _ wn) = if wn > 0 then ft |> e else ft--(#<|) :: Elem ->ParensSeqFt -> ParensSeqFt-(#<|) e@(Elem _ wn) ft = if wn > 0 then e <| ft else ft--ftSplit :: (Measure -> Bool) -> ParensSeqFt -> (ParensSeqFt, ParensSeqFt)-ftSplit p ft = case FT.viewl rt of- Elem w nw :< rrt -> let c = go w nw nw in (lt |># Elem w c, Elem (w .>. c) (nw - c) #<| rrt)- FT.EmptyL -> (ft, FT.empty)- where (lt, rt) = FT.split p ft- ltm = FT.measure lt- go :: Word64 -> Count -> Count -> Count- go w c nw = if c > 0- then if p (ltm <> FT.measure (Elem (w .<. (64 - c) .>. (64 - c)) c))- then go w (c - 1) nw- else c- else 0--atSizeBelowZero :: Count -> Measure -> Bool-atSizeBelowZero n m = n < size (m :: Measure)--atMinZero :: Measure -> Bool-atMinZero m = min (m :: Measure) <= 0
− src/HaskellWorks/Data/BalancedParens/Internal/ParensSeq/Types.hs
@@ -1,5 +0,0 @@-module HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Types- ( ParensSeq- ) where--import HaskellWorks.Data.BalancedParens.Internal.ParensSeq.Internal (ParensSeq)
+ src/HaskellWorks/Data/BalancedParens/ParensSeq.hs view
@@ -0,0 +1,139 @@+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}++module HaskellWorks.Data.BalancedParens.ParensSeq+ ( ParensSeq(..)+ , mempty+ , size+ , fromWord64s+ , fromPartialWord64s+ , toPartialWord64s+ , fromBools+ , toBools+ , splitAt+ , take+ , drop+ , firstChild+ , nextSibling+ , (<|), (><), (|>)+ ) where++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+import HaskellWorks.Data.FingerTree (ViewL (..), ViewR (..), (<|), (><), (|>))+import HaskellWorks.Data.Positioning+import Prelude hiding (drop, max, min, splitAt, take)++import qualified Data.List as L+import qualified HaskellWorks.Data.BalancedParens.Internal.ParensSeq as PS+import qualified HaskellWorks.Data.BalancedParens.Internal.Word as W+import qualified HaskellWorks.Data.FingerTree as FT++empty :: ParensSeq+empty = ParensSeq FT.empty++size :: ParensSeq -> Count+size (ParensSeq parens) = PS.size (FT.measure parens :: PS.Measure)++-- TODO Needs optimisation+fromWord64s :: Traversable f => f Word64 -> ParensSeq+fromWord64s = foldl go empty+ where go :: ParensSeq -> Word64 -> ParensSeq+ go ps w = ParensSeq (PS.parens ps |> Elem w 64)++-- TODO Needs optimisation+fromPartialWord64s :: Traversable f => f (Word64, Count) -> ParensSeq+fromPartialWord64s = foldl go empty+ where go :: ParensSeq -> (Word64, Count) -> ParensSeq+ go ps (w, n) = ParensSeq (PS.parens ps |> Elem w n)++toPartialWord64s :: ParensSeq -> [(Word64, Count)]+toPartialWord64s = L.unfoldr go . coerce+ where go :: ParensSeqFt -> Maybe ((Word64, Count), ParensSeqFt)+ go ft = case FT.viewl ft of+ PS.Elem w n :< rt -> Just ((w, coerce n), rt)+ FT.EmptyL -> Nothing++fromBools :: [Bool] -> ParensSeq+fromBools = go empty+ where go :: ParensSeq -> [Bool] -> ParensSeq+ go (ParensSeq ps) (b:bs) = case FT.viewr ps of+ FT.EmptyR -> go (ParensSeq (FT.singleton (Elem b' 1))) bs+ lt :> Elem w n ->+ let newPs = if n >= 64+ then ps |> Elem b' 1+ else lt |> Elem (w .|. (b' .<. fromIntegral n)) (n + 1)+ in go (ParensSeq newPs) bs+ where b' = if b then 1 else 0 :: Word64+ go ps [] = ps++toBools :: ParensSeq -> [Bool]+toBools ps = toBoolsDiff ps []++toBoolsDiff :: ParensSeq -> [Bool] -> [Bool]+toBoolsDiff ps = mconcat (fmap go (toPartialWord64s ps))+ where go :: (Word64, Count) -> [Bool] -> [Bool]+ go (w, n) = W.partialToBoolsDiff (fromIntegral n) w++drop :: Count -> ParensSeq -> ParensSeq+drop n ps = snd (splitAt n ps)++take :: Count -> ParensSeq -> ParensSeq+take n ps = fst (splitAt n ps)++splitAt :: Count -> ParensSeq -> (ParensSeq, ParensSeq)+splitAt n (ParensSeq parens) = case FT.split (PS.atSizeBelowZero n) parens of+ (lt, rt) -> let+ n' = n - PS.size (FT.measure lt :: PS.Measure)+ u = 64 - n'+ in case FT.viewl rt of+ PS.Elem w nw :< rrt -> if n' >= nw+ then (ParensSeq lt , ParensSeq rrt )+ else (ParensSeq (lt |> PS.Elem ((w .<. u) .>. u) n'), ParensSeq (PS.Elem (w .>. n') (nw - n') <| rrt))+ FT.EmptyL -> (ParensSeq lt, ParensSeq FT.empty)++firstChild :: ParensSeq -> Count -> Maybe Count+firstChild ps n = case FT.viewl ft of+ PS.Elem w nw :< rt -> if nw >= 2+ then case w .&. 3 of+ 3 -> Just (n + 1)+ _ -> Nothing+ else if nw >= 1+ then case w .&. 1 of+ 1 -> case FT.viewl rt of+ PS.Elem w' nw' :< _ -> if nw' >= 1+ then case w' .&. 1 of+ 1 -> Just (n + 1)+ _ -> Nothing+ else Nothing+ FT.EmptyL -> Nothing+ _ -> Nothing+ else Nothing+ FT.EmptyL -> Nothing+ where ParensSeq ft = drop (n - 1) ps++nextSibling :: ParensSeq -> Count -> Maybe Count+nextSibling (ParensSeq ps) n = do+ let (lt0, rt0) = PS.ftSplit (PS.atSizeBelowZero (n - 1)) ps+ _ <- case FT.viewl rt0 of+ PS.Elem w nw :< _ -> if nw >= 1 && w .&. 1 == 1 then Just () else Nothing+ FT.EmptyL -> Nothing+ let (lt1, rt1) = PS.ftSplit (PS.atSizeBelowZero 1) rt0+ let (lt2, rt2) = PS.ftSplit PS.atMinZero rt1+ case FT.viewl rt2 of+ PS.Elem w nw :< _ -> if nw >= 1 && w .&. 1 == 0 then Just () else Nothing+ FT.EmptyL -> Nothing+ let (lt3, rt3) = PS.ftSplit (PS.atSizeBelowZero 1) rt2+ case FT.viewl rt3 of+ PS.Elem w nw :< _ -> if nw >= 1 && w .&. 1 == 1 then Just () else Nothing+ FT.EmptyL -> Nothing+ return $ 1+ + PS.size (FT.measure lt0 :: PS.Measure)+ + PS.size (FT.measure lt1 :: PS.Measure)+ + PS.size (FT.measure lt2 :: PS.Measure)+ + PS.size (FT.measure lt3 :: PS.Measure)
+ src/HaskellWorks/Data/BalancedParens/ParensSeq/Types.hs view
@@ -0,0 +1,5 @@+module HaskellWorks.Data.BalancedParens.ParensSeq.Types+ ( ParensSeq+ ) where++import HaskellWorks.Data.BalancedParens.Internal.ParensSeq (ParensSeq)
test/HaskellWorks/Data/BalancedParens/Internal/ParensSeqSpec.hs view
@@ -4,19 +4,19 @@ module HaskellWorks.Data.BalancedParens.Internal.ParensSeqSpec where -import Data.Semigroup ((<>))-import HaskellWorks.Data.BalancedParens.Internal.ParensSeq ((<|), (><), (|>))+import Data.Semigroup ((<>))+import HaskellWorks.Data.BalancedParens.ParensSeq ((<|), (><), (|>)) import HaskellWorks.Data.RankSelect.Base.Select1 import HaskellWorks.Hspec.Hedgehog import Hedgehog import Test.Hspec -import qualified HaskellWorks.Data.BalancedParens.BalancedParens as BP-import qualified HaskellWorks.Data.BalancedParens.Gen as G-import qualified HaskellWorks.Data.BalancedParens.Internal.List as L-import qualified HaskellWorks.Data.BalancedParens.Internal.ParensSeq as PS-import qualified Hedgehog.Gen as G-import qualified Hedgehog.Range as R+import qualified HaskellWorks.Data.BalancedParens.BalancedParens as BP+import qualified HaskellWorks.Data.BalancedParens.Gen as G+import qualified HaskellWorks.Data.BalancedParens.Internal.List as L+import qualified HaskellWorks.Data.BalancedParens.ParensSeq as PS+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) #-}