q4c12-twofinger 0.0.0.1 → 0.0.0.2
raw patch · 3 files changed
+21/−30 lines, 3 filesdep ~bifunctorsPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
Dependency ranges changed: bifunctors
API changes (from Hackage documentation)
+ Q4C12.TwoFinger.Internal: takeSingleNodeLeft :: Stream a -> Stream e -> (Node e a, Stream a, Stream e)
+ Q4C12.TwoFinger.Internal: takeSingleNodeRight :: Stream e -> Stream a -> (Node e a, Stream e, Stream a)
Files
- CHANGELOG.markdown +5/−0
- q4c12-twofinger.cabal +4/−4
- src/Q4C12/TwoFinger/Internal.hs +12/−26
CHANGELOG.markdown view
@@ -1,3 +1,8 @@+q4c12-twofinger 0.0.0.2 (2017-12-08)+====================================++* Loosened `bifunctors` dependency bounds.+ q4c12-twofinger 0.0.0.1 (2017-12-08) ====================================
q4c12-twofinger.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 170352bc018b512f91fd2fd5b865796d5ba48ca28bccf4ef9d162864f7ffa13d+-- hash: ee28f4558151511959af58b3246f5e92eff0db31bede2ae44ebfe4721ab36575 name: q4c12-twofinger-version: 0.0.0.1+version: 0.0.0.2 synopsis: Efficient alternating finger trees description: This package provides efficient alternating sequences based on finger trees. These can represent sequences made up of two types of element, @e@ and @a@ where two of the same type of element cannot follow each other directly. .@@ -13,7 +13,7 @@ . Cons-like operations are /O(1)/ amortised, and append operations are /O(log(min(n, m)))/ amortised. .- For more details, please see the Haddock documentation of 'Q4C12.TwoFinger'.+ For more details, please see the Haddock documentation of "Q4C12.TwoFinger". category: Data Structures homepage: https://github.com/quasicomputational/mega/tree/master/packages/twofinger bug-reports: https://github.com/quasicomputational/mega/issues@@ -54,7 +54,7 @@ , streams >=3.3 && <3.4 if impl(ghc < 8.2) build-depends:- bifunctors >=5.4.2 && <5.5+ bifunctors >=5.4.2 && <5.6 default-language: Haskell2010 test-suite doctests
src/Q4C12/TwoFinger/Internal.hs view
@@ -1411,6 +1411,12 @@ (y, es'', as'') = f es' as' in (Node2 y a x, es'', as'') +takeSingleNodeLeft :: Stream a -> Stream e -> (Node e a, Stream a, Stream e)+takeSingleNodeLeft = takeNodeLeft (\as (e :> es) -> (e, as, es))++takeSingleNodeRight :: Stream e -> Stream a -> (Node e a, Stream e, Stream a)+takeSingleNodeRight = takeNodeRight (\(e :> es) as -> (e, es, as))+ infiniteOddA' :: (Stream a -> Stream e -> (Node e' a, Stream a, Stream e)) -> (Stream e -> Stream a -> (Node e' a, Stream e, Stream a))@@ -1439,7 +1445,7 @@ -- >>> take 5 $ unfoldr (fmap swap . hush . unsnocOddA) infinite -- [(20,30),(21,31),(22,32),(23,33),(24,34)] infiniteOddA :: Stream a -> Stream e -> Stream e -> Stream a -> TwoFingerOddA e a-infiniteOddA = infiniteOddA' (takeNodeLeft (\as (e :> es) -> (e, as, es))) (takeNodeRight (\(e :> es) as -> (e, es, as)))+infiniteOddA = infiniteOddA' takeSingleNodeLeft takeSingleNodeRight -- | Infinitely repeat the given @a@ and @e@. --@@ -1459,13 +1465,9 @@ infiniteOddE leftE leftA rightA rightE = DeepOddE (nodeToDigit prNode) inner (nodeToDigit sfNode) where- f :: Stream a -> Stream e -> (Node e a, Stream a, Stream e)- f = takeNodeLeft (\as (e :> es) -> (e, as, es))- g :: Stream e -> Stream a -> (Node e a, Stream e, Stream a)- g = takeNodeRight (\(e :> es) as -> (e, es, as))- (prNode, leftE', leftA') = f leftA leftE- (sfNode, rightA', rightE') = g rightE rightA- inner = infiniteOddA' (takeNodeLeft f) (takeNodeRight g) leftE' leftA' rightA' rightE'+ (prNode, leftE', leftA') = takeSingleNodeLeft leftA leftE+ (sfNode, rightA', rightE') = takeSingleNodeRight rightE rightA+ inner = infiniteOddA' (takeNodeLeft takeSingleNodeLeft) (takeNodeRight takeSingleNodeRight) leftE' leftA' rightA' rightE' -- | Infinitely repeat the given @a@ and @e@. --@@ -1483,15 +1485,7 @@ -- [(20,30),(21,31),(22,32),(23,33),(24,34)] infiniteEvenA :: Stream a -> Stream e -> Stream a -> Stream e -> TwoFingerEvenA e a infiniteEvenA (a :> leftA) leftE rightA rightE =- DeepEvenA a (nodeToDigit prNode) inner (nodeToDigit sfNode)- where- f :: Stream a -> Stream e -> (Node e a, Stream a, Stream e)- f = takeNodeLeft (\as (e :> es) -> (e, as, es))- g :: Stream e -> Stream a -> (Node e a, Stream e, Stream a)- g = takeNodeRight (\(e :> es) as -> (e, es, as))- (prNode, leftE', leftA') = f leftA leftE- (sfNode, rightA', rightE') = g rightE rightA- inner = infiniteOddA' (takeNodeLeft f) (takeNodeRight g) leftE' leftA' rightA' rightE'+ halfconsOddE a $ infiniteOddE leftE leftA rightA rightE -- | --@@ -1509,12 +1503,4 @@ -- [(20,30),(21,31),(22,32),(23,33),(24,34)] infiniteEvenE :: Stream e -> Stream a -> Stream e -> Stream a -> TwoFingerEvenE e a infiniteEvenE leftE leftA rightE (a :> rightA) =- DeepEvenE (nodeToDigit prNode) inner (nodeToDigit sfNode) a- where- f :: Stream a -> Stream e -> (Node e a, Stream a, Stream e)- f = takeNodeLeft (\as (e :> es) -> (e, as, es))- g :: Stream e -> Stream a -> (Node e a, Stream e, Stream a)- g = takeNodeRight (\(e :> es) as -> (e, es, as))- (prNode, leftE', leftA') = f leftA leftE- (sfNode, rightA', rightE') = g rightE rightA- inner = infiniteOddA' (takeNodeLeft f) (takeNodeRight g) leftE' leftA' rightA' rightE'+ halfsnocOddE (infiniteOddE leftE leftA rightA rightE) a