| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | # General list operations. | 
					
						
							| 
									
										
										
										
											2013-10-24 02:02:04 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | with import ./trivial.nix; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  | rec { | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   inherit (builtins) head tail length isList elemAt concatLists filter elem genList; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 22:42:42 +00:00
										 |  |  |  |   # Create a list consisting of a single element.  `singleton x' is | 
					
						
							|  |  |  |  |   # sometimes more convenient with respect to indentation than `[x]' | 
					
						
							|  |  |  |  |   # when x spans multiple lines. | 
					
						
							|  |  |  |  |   singleton = x: [x]; | 
					
						
							| 
									
										
										
										
											2012-08-14 13:42:43 -04:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 22:42:42 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  |   # "Fold" a binary function `op' between successive elements of | 
					
						
							|  |  |  |  |   # `list' with `nul' as the starting value, i.e., `fold op nul [x_1 | 
					
						
							|  |  |  |  |   # x_2 ... x_n] == op x_1 (op x_2 ... (op x_n nul))'.  (This is | 
					
						
							|  |  |  |  |   # Haskell's foldr). | 
					
						
							| 
									
										
										
										
											2013-07-12 12:36:36 -04:00
										 |  |  |  |   fold = op: nul: list: | 
					
						
							|  |  |  |  |     let | 
					
						
							|  |  |  |  |       len = length list; | 
					
						
							|  |  |  |  |       fold' = n: | 
					
						
							|  |  |  |  |         if n == len | 
					
						
							| 
									
										
										
										
											2012-08-13 14:19:50 -04:00
										 |  |  |  |         then nul | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  |         else op (elemAt list n) (fold' (n + 1)); | 
					
						
							| 
									
										
										
										
											2013-07-12 12:36:36 -04:00
										 |  |  |  |     in fold' 0; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Left fold: `fold op nul [x_1 x_2 ... x_n] == op (... (op (op nul | 
					
						
							|  |  |  |  |   # x_1) x_2) ... x_n)'. | 
					
						
							| 
									
										
										
										
											2013-07-12 12:36:36 -04:00
										 |  |  |  |   foldl = op: nul: list: | 
					
						
							|  |  |  |  |     let | 
					
						
							|  |  |  |  |       len = length list; | 
					
						
							|  |  |  |  |       foldl' = n: | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  |         if n == -1 | 
					
						
							| 
									
										
										
										
											2012-08-13 14:19:50 -04:00
										 |  |  |  |         then nul | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  |         else op (foldl' (n - 1)) (elemAt list n); | 
					
						
							|  |  |  |  |     in foldl' (length list - 1); | 
					
						
							| 
									
										
										
										
											2012-08-13 14:19:50 -04:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-23 17:19:21 +02:00
										 |  |  |  |   # Strict version of foldl. | 
					
						
							|  |  |  |  |   foldl' = builtins.foldl' or foldl; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   # Map with index: `imap (i: v: "${v}-${toString i}") ["a" "b"] == | 
					
						
							|  |  |  |  |   # ["a-1" "b-2"]'. FIXME: why does this start to count at 1? | 
					
						
							|  |  |  |  |   imap = | 
					
						
							|  |  |  |  |     if builtins ? genList then | 
					
						
							|  |  |  |  |       f: list: genList (n: f (n + 1) (elemAt list n)) (length list) | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       f: list: | 
					
						
							|  |  |  |  |       let | 
					
						
							|  |  |  |  |         len = length list; | 
					
						
							|  |  |  |  |         imap' = n: | 
					
						
							|  |  |  |  |           if n == len | 
					
						
							|  |  |  |  |             then [] | 
					
						
							|  |  |  |  |             else [ (f (n + 1) (elemAt list n)) ] ++ imap' (n + 1); | 
					
						
							|  |  |  |  |       in imap' 0; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  |   # Map and concatenate the result. | 
					
						
							|  |  |  |  |   concatMap = f: list: concatLists (map f list); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Flatten the argument into a single list; that is, nested lists are | 
					
						
							|  |  |  |  |   # spliced into the top-level lists.  E.g., `flatten [1 [2 [3] 4] 5] | 
					
						
							|  |  |  |  |   # == [1 2 3 4 5]' and `flatten 1 == [1]'. | 
					
						
							|  |  |  |  |   flatten = x: | 
					
						
							|  |  |  |  |     if isList x | 
					
						
							| 
									
										
										
										
											2015-07-23 17:19:21 +02:00
										 |  |  |  |     then foldl' (x: y: x ++ (flatten y)) [] x | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  |     else [x]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-13 11:55:45 -04:00
										 |  |  |  |   # Remove elements equal to 'e' from a list.  Useful for buildInputs. | 
					
						
							| 
									
										
										
										
											2011-03-15 09:24:47 +00:00
										 |  |  |  |   remove = e: filter (x: x != e); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  |   # Find the sole element in the list matching the specified | 
					
						
							|  |  |  |  |   # predicate, returns `default' if no such element exists, or | 
					
						
							|  |  |  |  |   # `multiple' if there are multiple matching elements. | 
					
						
							|  |  |  |  |   findSingle = pred: default: multiple: list: | 
					
						
							| 
									
										
										
										
											2013-07-12 12:36:36 -04:00
										 |  |  |  |     let found = filter pred list; len = length found; | 
					
						
							|  |  |  |  |     in if len == 0 then default | 
					
						
							|  |  |  |  |       else if len != 1 then multiple | 
					
						
							|  |  |  |  |       else head found; | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-22 14:43:39 +00:00
										 |  |  |  |   # Find the first element in the list matching the specified | 
					
						
							|  |  |  |  |   # predicate or returns `default' if no such element exists. | 
					
						
							|  |  |  |  |   findFirst = pred: default: list: | 
					
						
							|  |  |  |  |     let found = filter pred list; | 
					
						
							|  |  |  |  |     in if found == [] then default else head found; | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-22 14:43:39 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  |   # Return true iff function `pred' returns true for at least element | 
					
						
							|  |  |  |  |   # of `list'. | 
					
						
							| 
									
										
										
										
											2015-07-23 19:25:58 +02:00
										 |  |  |  |   any = builtins.any or (pred: fold (x: y: if pred x then true else y) false); | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Return true iff function `pred' returns true for all elements of | 
					
						
							|  |  |  |  |   # `list'. | 
					
						
							| 
									
										
										
										
											2015-07-23 19:25:58 +02:00
										 |  |  |  |   all = builtins.all or (pred: fold (x: y: if pred x then y else false) true); | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-28 04:46:36 +01:00
										 |  |  |  |   # Count how many times function `pred' returns true for the elements | 
					
						
							|  |  |  |  |   # of `list'. | 
					
						
							| 
									
										
										
										
											2015-07-23 17:19:21 +02:00
										 |  |  |  |   count = pred: foldl' (c: x: if pred x then c + 1 else c) 0; | 
					
						
							| 
									
										
										
										
											2013-10-28 04:46:36 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  |   # Return a singleton list or an empty list, depending on a boolean | 
					
						
							|  |  |  |  |   # value.  Useful when building lists with optional elements | 
					
						
							|  |  |  |  |   # (e.g. `++ optional (system == "i686-linux") flashplayer'). | 
					
						
							|  |  |  |  |   optional = cond: elem: if cond then [elem] else []; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Return a list or an empty list, dependening on a boolean value. | 
					
						
							|  |  |  |  |   optionals = cond: elems: if cond then elems else []; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   # If argument is a list, return it; else, wrap it in a singleton | 
					
						
							|  |  |  |  |   # list.  If you're using this, you should almost certainly | 
					
						
							|  |  |  |  |   # reconsider if there isn't a more "well-typed" approach. | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  |   toList = x: if isList x then x else [x]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Return a list of integers from `first' up to and including `last'. | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   range = | 
					
						
							|  |  |  |  |     if builtins ? genList then | 
					
						
							|  |  |  |  |       first: last: | 
					
						
							|  |  |  |  |         if first > last | 
					
						
							|  |  |  |  |         then [] | 
					
						
							|  |  |  |  |         else genList (n: first + n) (last - first + 1) | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       first: last: | 
					
						
							|  |  |  |  |         if last < first | 
					
						
							|  |  |  |  |         then [] | 
					
						
							|  |  |  |  |         else [first] ++ range (first + 1) last; | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Partition the elements of a list in two lists, `right' and | 
					
						
							|  |  |  |  |   # `wrong', depending on the evaluation of a predicate. | 
					
						
							|  |  |  |  |   partition = pred: | 
					
						
							|  |  |  |  |     fold (h: t: | 
					
						
							|  |  |  |  |       if pred h | 
					
						
							|  |  |  |  |       then { right = [h] ++ t.right; wrong = t.wrong; } | 
					
						
							|  |  |  |  |       else { right = t.right; wrong = [h] ++ t.wrong; } | 
					
						
							|  |  |  |  |     ) { right = []; wrong = []; }; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-28 18:22:14 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   zipListsWith = | 
					
						
							|  |  |  |  |     if builtins ? genList then | 
					
						
							|  |  |  |  |       f: fst: snd: genList (n: f (elemAt fst n) (elemAt snd n)) (min (length fst) (length snd)) | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       f: fst: snd: | 
					
						
							|  |  |  |  |       let | 
					
						
							|  |  |  |  |         len = min (length fst) (length snd); | 
					
						
							|  |  |  |  |         zipListsWith' = n: | 
					
						
							|  |  |  |  |           if n != len then | 
					
						
							|  |  |  |  |             [ (f (elemAt fst n) (elemAt snd n)) ] | 
					
						
							|  |  |  |  |             ++ zipListsWith' (n + 1) | 
					
						
							|  |  |  |  |           else []; | 
					
						
							|  |  |  |  |       in zipListsWith' 0; | 
					
						
							| 
									
										
										
										
											2009-09-28 18:22:14 +00:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   zipLists = zipListsWith (fst: snd: { inherit fst snd; }); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-28 00:56:22 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   # Reverse the order of the elements of a list. | 
					
						
							|  |  |  |  |   reverseList = | 
					
						
							|  |  |  |  |     if builtins ? genList then | 
					
						
							|  |  |  |  |       xs: let l = length xs; in genList (n: elemAt xs (l - n - 1)) l | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       fold (e: acc: acc ++ [ e ]) []; | 
					
						
							| 
									
										
										
										
											2009-11-07 01:59:55 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-28 00:56:22 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-05 15:37:52 +00:00
										 |  |  |  |   # Sort a list based on a comparator function which compares two | 
					
						
							|  |  |  |  |   # elements and returns true if the first argument is strictly below | 
					
						
							|  |  |  |  |   # the second argument.  The returned list is sorted in an increasing | 
					
						
							|  |  |  |  |   # order.  The implementation does a quick-sort. | 
					
						
							| 
									
										
										
										
											2015-07-28 18:42:04 +02:00
										 |  |  |  |   sort = builtins.sort or ( | 
					
						
							|  |  |  |  |     strictLess: list: | 
					
						
							| 
									
										
										
										
											2009-11-07 01:59:55 +00:00
										 |  |  |  |     let | 
					
						
							| 
									
										
										
										
											2013-07-12 12:36:36 -04:00
										 |  |  |  |       len = length list; | 
					
						
							|  |  |  |  |       first = head list; | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  |       pivot' = n: acc@{ left, right }: let el = elemAt list n; next = pivot' (n + 1); in | 
					
						
							| 
									
										
										
										
											2013-07-12 12:36:36 -04:00
										 |  |  |  |         if n == len | 
					
						
							|  |  |  |  |           then acc | 
					
						
							|  |  |  |  |         else if strictLess first el | 
					
						
							|  |  |  |  |           then next { inherit left; right = [ el ] ++ right; } | 
					
						
							|  |  |  |  |         else | 
					
						
							|  |  |  |  |           next { left = [ el ] ++ left; inherit right; }; | 
					
						
							|  |  |  |  |       pivot = pivot' 1 { left = []; right = []; }; | 
					
						
							| 
									
										
										
										
											2009-11-07 01:59:55 +00:00
										 |  |  |  |     in | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  |       if len < 2 then list | 
					
						
							| 
									
										
										
										
											2015-07-28 18:42:04 +02:00
										 |  |  |  |       else (sort strictLess pivot.left) ++  [ first ] ++  (sort strictLess pivot.right)); | 
					
						
							| 
									
										
										
										
											2009-11-07 01:59:55 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 21:47:14 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-05 15:37:52 +00:00
										 |  |  |  |   # Return the first (at most) N elements of a list. | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   take = | 
					
						
							|  |  |  |  |     if builtins ? genList then | 
					
						
							|  |  |  |  |       count: sublist 0 count | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       count: list: | 
					
						
							|  |  |  |  |         let | 
					
						
							|  |  |  |  |           len = length list; | 
					
						
							|  |  |  |  |           take' = n: | 
					
						
							|  |  |  |  |             if n == len || n == count | 
					
						
							|  |  |  |  |               then [] | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |               [ (elemAt list n) ] ++ take' (n + 1); | 
					
						
							|  |  |  |  |         in take' 0; | 
					
						
							| 
									
										
										
										
											2009-12-08 21:47:14 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-05 15:37:52 +00:00
										 |  |  |  |   # Remove the first (at most) N elements of a list. | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  |   drop = | 
					
						
							|  |  |  |  |     if builtins ? genList then | 
					
						
							|  |  |  |  |       count: list: sublist count (length list) list | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       count: list: | 
					
						
							|  |  |  |  |         let | 
					
						
							|  |  |  |  |           len = length list; | 
					
						
							|  |  |  |  |           drop' = n: | 
					
						
							|  |  |  |  |             if n == -1 || n < count | 
					
						
							|  |  |  |  |               then [] | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |               drop' (n - 1) ++ [ (elemAt list n) ]; | 
					
						
							|  |  |  |  |         in drop' (len - 1); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Return a list consisting of at most ‘count’ elements of ‘list’, | 
					
						
							|  |  |  |  |   # starting at index ‘start’. | 
					
						
							|  |  |  |  |   sublist = start: count: list: | 
					
						
							|  |  |  |  |     let len = length list; in | 
					
						
							|  |  |  |  |     genList | 
					
						
							|  |  |  |  |       (n: elemAt list (n + start)) | 
					
						
							|  |  |  |  |       (if start >= len then 0 | 
					
						
							|  |  |  |  |        else if start + count > len then len - start | 
					
						
							|  |  |  |  |        else count); | 
					
						
							| 
									
										
										
										
											2010-04-17 18:26:40 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Return the last element of a list. | 
					
						
							| 
									
										
										
										
											2010-01-03 11:05:42 +00:00
										 |  |  |  |   last = list: | 
					
						
							| 
									
										
										
										
											2014-10-04 17:02:29 +02:00
										 |  |  |  |     assert list != []; elemAt list (length list - 1); | 
					
						
							| 
									
										
										
										
											2010-01-03 11:05:42 +00:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-13 18:26:19 -04:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-16 18:03:46 +02:00
										 |  |  |  |   # Return all elements but the last | 
					
						
							|  |  |  |  |   init = list: assert list != []; take (length list - 1) list; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-01 00:39:26 -05:00
										 |  |  |  |   deepSeqList = xs: y: if any (x: deepSeq x false) xs then y else y; | 
					
						
							| 
									
										
										
										
											2013-11-12 13:48:19 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-12 14:01:48 -05:00
										 |  |  |  |   crossLists = f: foldl (fs: args: concatMap (f: map f args) fs) [f]; | 
					
						
							| 
									
										
										
										
											2014-04-09 00:02:20 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Remove duplicate elements from the list. O(n^2) complexity. | 
					
						
							| 
									
										
										
										
											2014-11-12 21:36:26 +01:00
										 |  |  |  |   unique = list: | 
					
						
							|  |  |  |  |     if list == [] then | 
					
						
							|  |  |  |  |       [] | 
					
						
							|  |  |  |  |     else | 
					
						
							|  |  |  |  |       let | 
					
						
							|  |  |  |  |         x = head list; | 
					
						
							|  |  |  |  |         xs = unique (drop 1 list); | 
					
						
							|  |  |  |  |       in [x] ++ remove x xs; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Intersects list 'e' and another list. O(nm) complexity. | 
					
						
							| 
									
										
										
										
											2015-03-21 17:09:38 +01:00
										 |  |  |  |   intersectLists = e: filter (x: elem x e); | 
					
						
							| 
									
										
										
										
											2015-02-28 04:02:15 +01:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   # Subtracts list 'e' from another list. O(nm) complexity. | 
					
						
							| 
									
										
										
										
											2015-03-21 17:09:38 +01:00
										 |  |  |  |   subtractLists = e: filter (x: !(elem x e)); | 
					
						
							| 
									
										
										
										
											2015-07-28 17:31:43 +02:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-09 16:51:03 +00:00
										 |  |  |  | } |