Вы говорите, если кнопка нажата, но в вашем примере все кнопки в списке будут отключены. Попробуйте связать слушателя с каждой кнопкой, а не просто отключить его.
Для логики вы имеете в виду что-то вроде этого:
Arrays.asList(buttons).forEach(
button -> button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
button.setEnabled(false);
}
}));
Мне также нравится ответ Седрика, но у вас есть для добавления прослушивателя действий внутри цикла.
В обычном кодировании перечислителя по существу StepT[E, F, ?] ~> F[StepT[E, F, ?]]
. При попытке записать общий метод, преобразовывающий этот тип в Step[E, G, ?] ~> G[Step[E, G, ?]]
, учитывая F ~> G
, то Вы быстро столкнетесь с проблемой: необходимо "понизиться" Step[E, G, A]
к Step[E, F, A]
, чтобы быть в состоянии применить исходный перечислитель.
Scalaz также обеспечивает альтернативный перечислитель, кодирующий , который похож на это:
trait EnumeratorP[E, F[_]] {
def apply[G[_]: Monad](f: F ~> G): EnumeratorT[E, G]
}
Этот подход позволяет нам определять перечислитель, это конкретно относительно эффектов, в которых он нуждается, но это может быть "снято" для работы с потребителями, которые требуют более богатых контекстов. Мы можем изменить Ваш пример для использования EnumeratorP
(и более новый естественный подход преобразования, а не старый частичный порядок монады):
import scalaz._, Scalaz._, iteratee._, concurrent.Task
def enum: EnumeratorP[String, Id] = ???
def iter: IterateeT[String, Task, Int] = ???
val toTask = new (Id ~> Task) { def apply[A](a: A): Task[A] = Task(a) }
Мы можем теперь составить два как это:
scala> def result = (iter &= enum(toTask)).run
result: scalaz.concurrent.Task[Int]
EnumeratorP
одноместно (если эти F
применимо), и EnumeratorP
, сопутствующий объект обеспечивает некоторые функции для помощи с определением перечислителей, которые много походят на тех на [1 112] — существует empty
, perform
, enumPStream
, и т.д. Я предполагаю, что должно быть EnumeratorT
экземпляры, которые не могли быть реализованы с помощью EnumeratorP
кодирование, но первое, что пришло на ум я не уверен, на что они были бы похожи.