shithub: MicroHs

Download patch

ref: 03194fff9769bbca6991e8ab92ed70d6eacc06d0
parent: 7aebc6565dd17ce5bb678ceb0e51655383a4a842
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Thu Mar 28 05:21:51 EDT 2024

Add scan functions.

--- a/lib/Data/List.hs
+++ b/lib/Data/List.hs
@@ -254,6 +254,9 @@
   else
     x : xs
 
+dropWhileEnd :: (a -> Bool) -> [a] -> [a]
+dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) []
+
 span :: forall a . (a -> Bool) -> [a] -> ([a], [a])
 span p =
   let
@@ -416,3 +419,26 @@
 groupBy _  []     =  []
 groupBy eq (x:xs) =  (x:ys) : groupBy eq zs
   where (ys,zs) = span (eq x) xs
+
+scanl                   :: (b -> a -> b) -> b -> [a] -> [b]
+scanl f = rec
+  where rec q ls = q : case ls of
+                         []   -> []
+                         x:xs -> rec (f q x) xs
+
+scanl1 :: (a -> a -> a) -> [a] -> [a]
+scanl1 f (x:xs) = scanl f x xs
+scanl1 _ []     = []
+
+scanr :: (a -> b -> b) -> b -> [a] -> [b]
+scanr f z = rec
+  where rec []     =  [z]
+        rec (x:xs) =  f x q : qs
+              where qs@(q:_) = rec xs
+
+scanr1 :: (a -> a -> a) -> [a] -> [a]
+scanr1 f = rec
+  where rec []     = []
+        rec [x]    = [x]
+        rec (x:xs) = f x q : qs
+              where qs@(q:_) = rec xs
--