23 lines
900 B
Plaintext
23 lines
900 B
Plaintext
m@(Method traits) ** n@(Method traits)
|
|
"Answers a new Method whose effect is that of calling the first method
|
|
on the results of the second method applied to whatever arguments are passed.
|
|
This composition is associative, i.e. (a ** b) ** c = a ** (b ** c).
|
|
When the second method, n, does not take a *rest option or the first takes
|
|
more than one input, then the output is chunked into groups for its
|
|
consumption. E.g.:
|
|
#; `er ** #; `er applyTo: {'a'. 'b'. 'c'. 'd'} => 'abcd'
|
|
#; `er ** #name `er applyTo: {#a. #/}. => 'a/'"
|
|
[
|
|
n acceptsAdditionalArguments \/ [m arity = 1]
|
|
ifTrue:
|
|
[[| *args | m applyTo: {n applyTo: args}]]
|
|
ifFalse:
|
|
[[| *args |
|
|
m applyTo:
|
|
([| :stream |
|
|
args do: [| *each | stream nextPut: (n applyTo: each)]
|
|
inGroupsOf: n arity] writingAs: {})]]
|
|
].
|
|
|
|
#**`er asMethod: #compose: on: {Method traits. Method traits}.
|