@@ -1726,14 +1726,18 @@ instance Splittable (Seq a) where
1726
1726
splitState = splitAt
1727
1727
1728
1728
instance (Splittable a , Splittable b ) => Splittable (a , b ) where
1729
- splitState i (a, b) = ((al, bl), (ar, br))
1729
+ splitState i (a, b) = (al `seq` bl `seq` (al, bl), ar `seq` br `seq` (ar, br))
1730
1730
where
1731
1731
(al, ar) = splitState i a
1732
1732
(bl, br) = splitState i b
1733
1733
1734
+ {-# SPECIALIZE splitTraverseSeq :: (Seq x -> a -> b) -> Seq x -> Seq a -> Seq b #-}
1735
+ {-# SPECIALIZE splitTraverseSeq :: ((Seq x, Seq y) -> a -> b) -> (Seq x, Seq y) -> Seq a -> Seq b #-}
1734
1736
splitTraverseSeq :: (Splittable s ) => (s -> a -> b ) -> s -> Seq a -> Seq b
1735
1737
splitTraverseSeq f s (Seq xs) = Seq $ splitTraverseTree (\ s' (Elem a) -> Elem (f s' a)) s xs
1736
1738
1739
+ {-# SPECIALIZE splitTraverseTree :: (Seq x -> Elem y -> b) -> Seq x -> FingerTree (Elem y) -> FingerTree b #-}
1740
+ {-# SPECIALIZE splitTraverseTree :: (Seq x -> Node y -> b) -> Seq x -> FingerTree (Node y) -> FingerTree b #-}
1737
1741
splitTraverseTree :: (Sized a , Splittable s ) => (s -> a -> b ) -> s -> FingerTree a -> FingerTree b
1738
1742
splitTraverseTree _f _s Empty = Empty
1739
1743
splitTraverseTree f s (Single xs) = Single $ f s xs
@@ -1742,6 +1746,8 @@ splitTraverseTree f s (Deep n pr m sf) = Deep n (splitTraverseDigit f prs pr) (s
1742
1746
(prs, r) = splitState (size pr) s
1743
1747
(ms, sfs) = splitState (n - size pr - size sf) r
1744
1748
1749
+ {-# SPECIALIZE splitTraverseDigit :: (Seq x -> Elem y -> b) -> Seq x -> Digit (Elem y) -> Digit b #-}
1750
+ {-# SPECIALIZE splitTraverseDigit :: (Seq x -> Node y -> b) -> Seq x -> Digit (Node y) -> Digit b #-}
1745
1751
splitTraverseDigit :: (Sized a , Splittable s ) => (s -> a -> b ) -> s -> Digit a -> Digit b
1746
1752
splitTraverseDigit f s (One a) = One (f s a)
1747
1753
splitTraverseDigit f s (Two a b) = Two (f first a) (f second b)
@@ -1757,6 +1763,8 @@ splitTraverseDigit f s (Four a b c d) = Four (f first a) (f second b) (f third c
1757
1763
(middle, fourth) = splitState (size b + size c) s'
1758
1764
(second, third) = splitState (size b) middle
1759
1765
1766
+ {-# SPECIALIZE splitTraverseNode :: (Seq x -> Elem y -> b) -> Seq x -> Node (Elem y) -> Node b #-}
1767
+ {-# SPECIALIZE splitTraverseNode :: (Seq x -> Node y -> b) -> Seq x -> Node (Node y) -> Node b #-}
1760
1768
splitTraverseNode :: (Sized a , Splittable s ) => (s -> a -> b ) -> s -> Node a -> Node b
1761
1769
splitTraverseNode f s (Node2 ns a b) = Node2 ns (f first a) (f second b)
1762
1770
where
0 commit comments