diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -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)
 ====================================
 
diff --git a/q4c12-twofinger.cabal b/q4c12-twofinger.cabal
--- a/q4c12-twofinger.cabal
+++ b/q4c12-twofinger.cabal
@@ -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
diff --git a/src/Q4C12/TwoFinger/Internal.hs b/src/Q4C12/TwoFinger/Internal.hs
--- a/src/Q4C12/TwoFinger/Internal.hs
+++ b/src/Q4C12/TwoFinger/Internal.hs
@@ -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
