summaryrefslogtreecommitdiff
path: root/lib/ur
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2011-12-11 15:02:55 -0500
committerGravatar Adam Chlipala <adam@chlipala.net>2011-12-11 15:02:55 -0500
commit4f67fe6cd314ad3ca1286766f1f9f3d8c5084d48 (patch)
tree7d5004cf0d36df0abdb259ed724d4cb14f2ac8e6 /lib/ur
parent02f3311b6fd7af07e63b5a0df2598b148783fd61 (diff)
Some new List functions, based on code by Ron de Bruijn
Diffstat (limited to 'lib/ur')
-rw-r--r--lib/ur/list.ur31
-rw-r--r--lib/ur/list.urs8
2 files changed, 39 insertions, 0 deletions
diff --git a/lib/ur/list.ur b/lib/ur/list.ur
index 6a754287..2d5addc9 100644
--- a/lib/ur/list.ur
+++ b/lib/ur/list.ur
@@ -267,6 +267,18 @@ fun foldlMi [m] (_ : monad m) [a] [b] f =
foldlMi' 0
end
+fun filterM [m] (_ : monad m) [a] (p : a -> m bool) =
+ let
+ fun filterM' (acc : list a) (xs : list a) : m (list a) =
+ case xs of
+ [] => return (rev acc)
+ | x :: xs =>
+ c <- p x;
+ filterM' (if c then x :: acc else acc) xs
+ in
+ filterM' []
+ end
+
fun all [m] f =
let
fun all' ls =
@@ -393,3 +405,22 @@ fun assocAdd [a] [b] (_ : eq a) (x : a) (y : b) (ls : t (a * b)) =
fun recToList [a ::: Type] [r ::: {Unit}] (fl : folder r)
= @foldUR [a] [fn _ => list a] (fn [nm ::_] [rest ::_] [[nm] ~ rest] x xs =>
x :: xs) [] fl
+
+fun take [a] (n : int) (xs : list a) : list a =
+ if n <= 0 then
+ []
+ else
+ case xs of
+ [] => []
+ | x :: xs => x :: take (n-1) xs
+
+fun drop [a] (n : int) (xs : list a) : list a =
+ if n <= 0 then
+ xs
+ else
+ case xs of
+ [] => []
+ | x :: xs => drop (n-1) xs
+
+fun splitAt [a] (n : int) (xs : list a) : list a * list a =
+ (take n xs, drop n xs)
diff --git a/lib/ur/list.urs b/lib/ur/list.urs
index 2a28d148..15204590 100644
--- a/lib/ur/list.urs
+++ b/lib/ur/list.urs
@@ -46,6 +46,9 @@ val foldlM : m ::: (Type -> Type) -> monad m -> a ::: Type -> b ::: Type
val foldlMi : m ::: (Type -> Type) -> monad m -> a ::: Type -> b ::: Type
-> (int -> a -> b -> m b) -> b -> t a -> m b
+val filterM : m ::: (Type -> Type) -> monad m -> a ::: Type
+ -> (a -> m bool) -> t a -> m (t a)
+
val foldlMap : a ::: Type -> b ::: Type -> c ::: Type
-> (a -> b -> c * b) -> b -> t a -> t c * b
@@ -90,3 +93,8 @@ val assocAdd : a ::: Type -> b ::: Type -> eq a -> a -> b -> t (a * b) -> t (a *
(** Converting records to lists *)
val recToList : a ::: Type -> r ::: {Unit} -> folder r -> $(mapU a r) -> t a
+
+(* Divide a list into two sections at a particular 0-based position, returning the second, first, or both parts, respectively. *)
+val drop : t ::: Type -> int -> list t -> list t
+val take : t ::: Type -> int -> list t -> list t
+val splitAt : t ::: Type -> int -> list t -> list t * list t