strict-list 0.1.2 → 0.1.3
raw patch · 3 files changed
+25/−2 lines, 3 files
Files
- library/StrictList.hs +20/−0
- strict-list.cabal +1/−1
- test/Main.hs +4/−1
library/StrictList.hs view
@@ -191,6 +191,26 @@ in buildPrefix Nil {-|+An opposite version of `span`. I.e.,++>break predicate = span (not . predicate)+-}+break :: (a -> Bool) -> List a -> (List a, List a)+break predicate = first reverse . breakReversed predicate++{-|+Same as `break`, only with the first list in reverse order.+-}+breakReversed :: (a -> Bool) -> List a -> (List a, List a)+breakReversed predicate = let+ buildPrefix !prefix = \ case+ Cons head tail -> if predicate head+ then (prefix, Cons head tail)+ else buildPrefix (Cons head prefix) tail+ _ -> (prefix, Nil)+ in buildPrefix Nil++{-| Same as @(`takeWhile` predicate . `reverse`)@. E.g.,
strict-list.cabal view
@@ -1,5 +1,5 @@ name: strict-list-version: 0.1.2+version: 0.1.3 synopsis: Strict linked list description: Implementation of strict linked list with care taken about stack.
test/Main.hs view
@@ -1,6 +1,6 @@ module Main where -import Prelude hiding (span, choose, reverse, toList, List, filter, take, drop, takeWhile, dropWhile, head, last, tail, init)+import Prelude hiding (break, span, choose, reverse, toList, List, filter, take, drop, takeWhile, dropWhile, head, last, tail, init) import GHC.Exts as Exports (IsList(..)) import Test.QuickCheck.Instances import Test.Tasty@@ -49,6 +49,9 @@ , testProperty "span" $ forAll ((,) <$> predicateGen <*> strictAndLazyListGen) $ \ (predicate, (strict, lazy)) -> bimap toList toList (span predicate strict) === Lazy.span predicate lazy+ ,+ testProperty "break" $ forAll ((,) <$> predicateGen <*> strictAndLazyListGen) $ \ (predicate, (strict, lazy)) ->+ bimap toList toList (break predicate strict) === Lazy.break predicate lazy , testProperty "takeWhileFromEnding" $ forAll ((,) <$> predicateGen <*> strictAndLazyListGen) $ \ (predicate, (strict, lazy)) -> toList (takeWhileFromEnding predicate strict) === Lazy.takeWhile predicate (Lazy.reverse lazy)