packages feed

strict-list 0.1.2 → 0.1.3

raw patch · 3 files changed

+25/−2 lines, 3 files

Files

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)