@ -613,9 +613,9 @@ For a side-effecting variant, see also `-each-indexed'."
( nreverse , r ) ) ) )
( nreverse , r ) ) ) )
( defun -map-when ( pred rep list )
( defun -map-when ( pred rep list )
" Return a new list where the elements in LIST that do not match the PRED function
" Use PRED to conditionally apply REP to each item in LIST.
are unchanged, and where the elements in LIST that do match the PRED function are mapped
Return a copy of LIST where the items for which PRED returns nil
through the REP function.
are unchanged, and the rest are mapped through the REP function.
Alias: ` -replace-where '
Alias: ` -replace-where '
@ -626,7 +626,9 @@ See also: `-update-at'"
( defalias '--replace-where '--map-when )
( defalias '--replace-where '--map-when )
( defun -map-first ( pred rep list )
( defun -map-first ( pred rep list )
" Replace first item in LIST satisfying PRED with result of REP called on this item.
" Use PRED to determine the first item in LIST to call REP on.
Return a copy of LIST where the first item for which PRED returns
non-nil is replaced with the result of calling REP on that item.
See also: ` -map-when ', ` -replace-first ' "
See also: ` -map-when ', ` -replace-first ' "
( let ( front )
( let ( front )
@ -643,7 +645,9 @@ See also: `-map-when', `-replace-first'"
` ( -map-first ( lambda ( it ) , pred ) ( lambda ( it ) ( ignore it ) , rep ) , list ) )
` ( -map-first ( lambda ( it ) , pred ) ( lambda ( it ) ( ignore it ) , rep ) , list ) )
( defun -map-last ( pred rep list )
( defun -map-last ( pred rep list )
" Replace last item in LIST satisfying PRED with result of REP called on this item.
" Use PRED to determine the last item in LIST to call REP on.
Return a copy of LIST where the last item for which PRED returns
non-nil is replaced with the result of calling REP on that item.
See also: ` -map-when ', ` -replace-last ' "
See also: ` -map-when ', ` -replace-last ' "
( nreverse ( -map-first pred rep ( reverse list ) ) ) )
( nreverse ( -map-first pred rep ( reverse list ) ) ) )
@ -739,10 +743,7 @@ See also: `-flatten'"
( setq list ( apply #' append ( mapcar #' -list list ) ) ) )
( setq list ( apply #' append ( mapcar #' -list list ) ) ) )
list )
list )
( defun -concat ( &rest lists )
( defalias '-concat #' append )
" Return a new list with the concatenation of the elements in the supplied LISTS. "
( declare ( pure t ) ( side-effect-free t ) )
( apply 'append lists ) )
( defalias '-copy 'copy-sequence
( defalias '-copy 'copy-sequence
" Create a shallow copy of LIST.
" Create a shallow copy of LIST.
@ -1057,8 +1058,10 @@ Alias: `-none-p'"
( ---truthy? ( and , y , n ) ) ) ) )
( ---truthy? ( and , y , n ) ) ) ) )
( defun -only-some? ( pred list )
( defun -only-some? ( pred list )
" Return ` t ` if at least one item of LIST matches PRED and at least one item of LIST does not match PRED.
" Return t if different LIST items both satisfy and do not satisfy PRED.
Return ` nil ` both if all items match the predicate or if none of the items match the predicate.
That is, if PRED returns both nil for at least one item, and
non-nil for at least one other item in LIST. Return nil if all
items satisfy the predicate or none of them do.
Alias: ` -only-some-p ' "
Alias: ` -only-some-p ' "
( --only-some? ( funcall pred it ) list ) )
( --only-some? ( funcall pred it ) list ) )
@ -1217,11 +1220,15 @@ See also: `-replace'"
( nconc ( car split-list ) ( cons x ( cdr ( cadr split-list ) ) ) ) ) )
( nconc ( car split-list ) ( cons x ( cdr ( cadr split-list ) ) ) ) ) )
( defun -update-at ( n func list )
( defun -update-at ( n func list )
" Return a list with element at Nth position in LIST replaced with ` (func (nth n list)) ` .
" Use FUNC to update the Nth element of LIST.
Return a copy of LIST where the Nth element is replaced with the
result of calling FUNC on it.
See also: ` -map-when ' "
See also: ` -map-when ' "
( let ( ( split-list ( -split-at n list ) ) )
( let ( ( split-list ( -split-at n list ) ) )
( nconc ( car split-list ) ( cons ( funcall func ( car ( cadr split-list ) ) ) ( cdr ( cadr split-list ) ) ) ) ) )
( nconc ( car split-list )
( cons ( funcall func ( car ( cadr split-list ) ) )
( cdr ( cadr split-list ) ) ) ) ) )
( defmacro --update-at ( n form list )
( defmacro --update-at ( n form list )
" Anaphoric version of `-update-at' . "
" Anaphoric version of `-update-at' . "
@ -1270,7 +1277,14 @@ See also: `-remove-at', `-remove'"
( list ( nreverse , r ) , l ) ) ) )
( list ( nreverse , r ) , l ) ) ) )
( defun -split-with ( pred list )
( defun -split-with ( pred list )
" Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)), in no more than one pass through the list. "
" Split LIST into a prefix satisfying PRED, and the rest.
The first sublist is the prefix of LIST with successive elements
satisfying PRED, and the second sublist is the remaining elements
that do not. The result is like performing
( ( -take-while PRED LIST ) ( -drop-while PRED LIST ) )
but in no more than a single pass through LIST. "
( --split-with ( funcall pred it ) list ) )
( --split-with ( funcall pred it ) list ) )
( defmacro -split-on ( item list )
( defmacro -split-on ( item list )
@ -1318,11 +1332,16 @@ This function can be thought of as a generalization of
( list ( nreverse , y ) ( nreverse , n ) ) ) ) )
( list ( nreverse , y ) ( nreverse , n ) ) ) ) )
( defun -separate ( pred list )
( defun -separate ( pred list )
" Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one pass through the list. "
" Split LIST into two sublists based on whether items satisfy PRED.
The result is like performing
( ( -filter PRED LIST ) ( -remove PRED LIST ) )
but in a single pass through LIST. "
( --separate ( funcall pred it ) list ) )
( --separate ( funcall pred it ) list ) )
( defun dash--partition-all-in-steps-reversed ( n step list )
( defun dash--partition-all-in-steps-reversed ( n step list )
" Used by `-partition-all-in-steps' and `-partition-in-steps' . "
" Like `-partition-all-in-steps' , but the result is reversed ."
( when ( < step 1 )
( when ( < step 1 )
( signal 'wrong-type-argument
( signal 'wrong-type-argument
` ( " Step size < 1 results in juicy infinite loops " , step ) ) )
` ( " Step size < 1 results in juicy infinite loops " , step ) ) )
@ -1333,19 +1352,20 @@ This function can be thought of as a generalization of
result ) )
result ) )
( defun -partition-all-in-steps ( n step list )
( defun -partition-all-in-steps ( n step list )
" Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart.
" Partition LIST into sublists of length N that are STEP items apart.
The last groups may contain less than N items. "
Adjacent groups may overlap if N exceeds the STEP stride.
Trailing groups may contain less than N items. "
( declare ( pure t ) ( side-effect-free t ) )
( declare ( pure t ) ( side-effect-free t ) )
( nreverse ( dash--partition-all-in-steps-reversed n step list ) ) )
( nreverse ( dash--partition-all-in-steps-reversed n step list ) ) )
( defun -partition-in-steps ( n step list )
( defun -partition-in-steps ( n step list )
" Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart.
" Partition LIST into sublists of length N that are STEP items apart.
If there are not enough items to make the last group N-sized,
Like ` -partition-all-in-steps ', but if there are not enough items
those items are discarded. "
to make the last group N-sized, t hose items are discarded. "
( declare ( pure t ) ( side-effect-free t ) )
( declare ( pure t ) ( side-effect-free t ) )
( let ( ( result ( dash--partition-all-in-steps-reversed n step list ) ) )
( let ( ( result ( dash--partition-all-in-steps-reversed n step list ) ) )
( while ( and result ( < ( length ( car result ) ) n ) )
( while ( and result ( < ( length ( car result ) ) n ) )
( !cdr result ) )
( pop result ) )
( nreverse result ) ) )
( nreverse result ) ) )
( defun -partition-all ( n list )
( defun -partition-all ( n list )
@ -1523,7 +1543,8 @@ elements of LIST. Keys are compared by `equal'."
( defmacro --zip-with ( form list1 list2 )
( defmacro --zip-with ( form list1 list2 )
" Anaphoric form of `-zip-with' .
" Anaphoric form of `-zip-with' .
The elements in list1 are bound as symbol ` it ', the elements in list2 as symbol ` other '. "
Each element in turn of LIST1 is bound to ` it ', and of LIST2 to
` other ', before evaluating FORM. "
( declare ( debug ( form form form ) ) )
( declare ( debug ( form form form ) ) )
( let ( ( r ( make-symbol " result " ) )
( let ( ( r ( make-symbol " result " ) )
( l1 ( make-symbol " list1 " ) )
( l1 ( make-symbol " list1 " ) )
@ -2611,9 +2632,9 @@ Alias: `-uniq'"
( defalias '-uniq '-distinct )
( defalias '-uniq '-distinct )
( defun -union ( list list2 )
( defun -union ( list list2 )
" Return a new list containing the elements of LIST and elements of LIST2 that are not in LIST .
" Return a new list of all elements appearing in either LIST1 or LIST2 .
The test for equality is done with ` equal ',
Equality is defined by the value of ` -compare-fn ' if non-nil ;
or with ` -compare-fn ' if that 's non-nil ."
otherwise ` equal ' ."
;; We fall back to iteration implementation if the comparison
;; We fall back to iteration implementation if the comparison
;; function isn't one of `eq', `eql' or `equal'.
;; function isn't one of `eq', `eql' or `equal'.
( let* ( ( result ( reverse list ) )
( let* ( ( result ( reverse list ) )
@ -2630,9 +2651,9 @@ or with `-compare-fn' if that's non-nil."
( nreverse result ) ) )
( nreverse result ) ) )
( defun -intersection ( list list2 )
( defun -intersection ( list list2 )
" Return a new list containing only the elements that are members of both LIST and LIST2.
" Return a new list of the elements appearing in both LIST1 and LIST2.
The test for equality is done with ` equal ',
Equality is defined by the value of ` -compare-fn ' if non-nil ;
or with ` -compare-fn ' if that 's non-nil ."
otherwise ` equal ' ."
( --filter ( -contains? list2 it ) list ) )
( --filter ( -contains? list2 it ) list ) )
( defun -difference ( list list2 )
( defun -difference ( list list2 )
@ -3316,18 +3337,36 @@ In types: (a -> a) -> a -> a."
re ) ) ) ) )
re ) ) ) ) )
( defun -prodfn ( &rest fns )
( defun -prodfn ( &rest fns )
" Take a list of n functions and return a function that takes a
" Return a function that applies each of FNS to each of a list of arguments.
list of length n, applying i-th function to i-th element of the
input list. Returns a list of length n.
Takes a list of N functions and returns a function that takes a
list of length N, applying Ith function to Ith element of the
input list. Returns a list of length N.
In types ( for n=2 ) : ( ( a -> b ) , ( c -> d ) ) -> ( a, c ) -> ( b, d )
In types ( for N =2) : ( ( a -> b ) , ( c -> d ) ) -> ( a, c ) -> ( b, d )
This function satisfies the following laws:
This function satisfies the following laws:
( -compose ( -prodfn f g . . . ) ( -prodfn f\\= ' g\\= ' . . . ) ) = ( -prodfn ( -compose f f\\= ' ) ( -compose g g\\= ' ) . . . )
( -compose ( -prodfn f g . . . )
( -prodfn f g . . . ) = ( -juxt ( -compose f ( -partial \\= 'nth 0 ) ) ( -compose g ( -partial \\= 'nth 1 ) ) . . . )
( -prodfn f\\= ' g\\= ' . . . ) )
( -compose ( -prodfn f g . . . ) ( -juxt f\\= ' g\\= ' . . . ) ) = ( -juxt ( -compose f f\\= ' ) ( -compose g g\\= ' ) . . . )
= ( -prodfn ( -compose f f\\= ' )
( -compose ( -partial \\= 'nth n ) ( -prod f1 f2 . . . ) ) = ( -compose fn ( -partial \\= 'nth n ) ) "
( -compose g g\\= ' )
. . . )
( -prodfn f g . . . )
= ( -juxt ( -compose f ( -partial # \\= 'nth 0 ) )
( -compose g ( -partial # \\= 'nth 1 ) )
. . . )
( -compose ( -prodfn f g . . . )
( -juxt f\\= ' g\\= ' . . . ) )
= ( -juxt ( -compose f f\\= ' )
( -compose g g\\= ' )
. . . )
( -compose ( -partial # \\= 'nth n )
( -prod f1 f2 . . . ) )
= ( -compose fn ( -partial # \\= 'nth n ) ) "
( lambda ( x ) ( -zip-with 'funcall fns x ) ) )
( lambda ( x ) ( -zip-with 'funcall fns x ) ) )
;;; Font lock
;;; Font lock