Библиотеку, делающую эмуляцию yield не подскажете?
От: elmal  
Дата: 23.07.14 14:06
Оценка:
Хочу написать ленивый итератор, делающий обход в ширину возможно циклического графа.

Конечно, могу написать таким кодом, что там сам черт ногу сломит, громоздко, но хотелось бы элегантности.

Вот код, который бы хотелось иметь:
    @Continuable
    public static <T> Iterable<Integer> bfIterate(T object, Function<T, Collection<T>> childExtractor) {
        Queue<T> queue = new LinkedList<>();
        queue.add(object);
        Yield.ret(object);
        while(!queue.isEmpty()) {
            T node = queue.remove();
            for(T child : childExtractor.apply(node)) {
                Yield.ret(child);
                queue.add(child);
            }
        }
        return Yield.done();
    }


Использовал библиотеку jyield. Но здесь меня не устраивает, что требуется дополнительная обработка Java кода, выполнения
java -javaagent:../../jyield-0.0.6-jar-with-dependencies.jar над исходниками или байт кодом, что создает некоторый геморрой при сборке, запуске тестов и т.д.

Кто нидь библиотеку не требующий выполнения -javaagent может сказать? Или придется самому лисапед писать?

Если что, Java 8, Spring 4 — все фичи доступны.
Re: Библиотеку, делающую эмуляцию yield не подскажете?
От: Blazkowicz Россия  
Дата: 23.07.14 14:27
Оценка:
Здравствуйте, elmal, Вы писали:

E>Использовал библиотеку jyield. Но здесь меня не устраивает, что требуется дополнительная обработка Java кода, выполнения

E>java -javaagent:../../jyield-0.0.6-jar-with-dependencies.jar над исходниками или байт кодом, что создает некоторый геморрой при сборке, запуске тестов и т.д.
E>Кто нидь библиотеку не требующий выполнения -javaagent может сказать? Или придется самому лисапед писать?
E>Если что, Java 8, Spring 4 — все фичи доступны.
Под yeild имеется ввиду Continuation? Где-то видел прикольную версию для Java. Но, по-моему без инструментации не получится. javaagent просто даёт runtime инструментацию. Можно тоже самое но в compile time провернуть.
Re[2]: Библиотеку, делающую эмуляцию yield не подскажете?
От: Blazkowicz Россия  
Дата: 23.07.14 14:31
Оценка: 18 (2)
Здравствуйте, Blazkowicz, Вы писали:

E>>Если что, Java 8, Spring 4 — все фичи доступны.

Собственно вот подборка альтернатив
http://stackoverflow.com/questions/1456083/continuations-in-java
Возможно какая-то из них захаченый байткод имеет внутри фрейверка, так что не требует изменений в клиентском коде. Надо почитать.
Re[2]: Библиотеку, делающую эмуляцию yield не подскажете?
От: elmal  
Дата: 23.07.14 14:32
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Под yeild имеется ввиду Continuation? Где-то видел прикольную версию для Java.

Да я ее и привел скорее всего. Лучшее что я видел, по синтаксису полностью устраивает.

Но, по-моему без инструментации не получится. javaagent просто даёт runtime инструментацию. Можно тоже самое но в compile time провернуть.
Очень бы не хотелось инструментации.
Скорее всего так было раньше. А вот с выходом Java 8 есть вероятность что способ появился. Да и с помощью аспектов спринга скорее всего возможно что можно сделать. На производительность и оверхед мне вообще пофик, будет выполняться меньше секунды — нормально .
Re[3]: Библиотеку, делающую эмуляцию yield не подскажете?
От: Blazkowicz Россия  
Дата: 23.07.14 14:40
Оценка:
Здравствуйте, elmal, Вы писали:

E>Да я ее и привел скорее всего. Лучшее что я видел, по синтаксису полностью устраивает.

Я вот это смотрел. Вроде ничего, но тоже через инструментацию.
https://code.google.com/p/coroutines/

E>А вот с выходом Java 8 есть вероятность что способ появился.

Нет, не появился. Я за всеми новинками в Java слежу. В какой-то момент предлагали coroutines в Java 8, но не включили.

E>Да и с помощью аспектов спринга скорее всего возможно что можно сделать. На производительность и оверхед мне вообще пофик, будет выполняться меньше секунды — нормально .

Аспекты спринга работают через прокси. Вряд ли с ними можно Continuation сделать.

Как я уже упоминал, можно просто в build time модифицировать код, если javaagent не угодил. Вот например:
http://commons.apache.org/sandbox/commons-javaflow/antTask.html
У них же там как альтернатива есть и свой ClassLoader, через который модифицируется байт-код при загрузке. До появления javaagent это был единственный способ инструментации в рантайме.
Re: Библиотеку, делающую эмуляцию yield не подскажете?
От: mazurkin http://mazurkin.info
Дата: 23.07.14 14:48
Оценка: +1 :)
Зачем тут yield?

public class BFSIterator implements Iterator<BFSIterator.Item> {

    private Queue<Item> queue;

    public BFSIterator(Item root) {
        this.queue = new LinkedList<Item>();
        this.queue.add(root);
    }

    @Override
    public boolean hasNext() {
        return queue.size() > 0;
    }

    @Override
    public Item next() {
        Item item = queue.remove();
        for(Item child : item.children()) {
            queue.add(child);
        }
        return item;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();

    }

    public interface Item {

        Collection<Item> children();
    }

}
Re[2]: Библиотеку, делающую эмуляцию yield не подскажете?
От: elmal  
Дата: 23.07.14 15:43
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>Зачем тут yield?

Громоздковато. Класс городить приходится. А если использовать yield — выглядело бы все очень элегантно.
Или хотя б через LazySeq.
Re[3]: Библиотеку, делающую эмуляцию yield не подскажете?
От: mazurkin http://mazurkin.info
Дата: 24.07.14 08:22
Оценка: +4
А вам шашечки или ехать? Про элегантность yield потом спросите коллегу, который будет ваш кусок отлаживать.

M>>Зачем тут yield?

E>Громоздковато. Класс городить приходится. А если использовать yield — выглядело бы все очень элегантно.
E>Или хотя б через LazySeq.
Re: Библиотеку, делающую эмуляцию yield не подскажете?
От: fixxer  
Дата: 24.07.14 09:37
Оценка:
E>Хочу написать ленивый итератор, делающий обход в ширину возможно циклического графа.
E>Конечно, могу написать таким кодом, что там сам черт ногу сломит, громоздко, но хотелось бы элегантности.
E>
E> ...
E>


А что если просто развернуть итератор, то есть использовать Observer (push вместо pull)? Как реализацию взять, например, RxJava.
Re: Библиотеку, делающую эмуляцию yield не подскажете?
От: halo Украина  
Дата: 28.08.14 19:48
Оценка:
Здравствуйте, elmal, Вы писали:

E>Хочу написать ленивый итератор, делающий обход в ширину возможно циклического графа.


E>Конечно, могу написать таким кодом, что там сам черт ногу сломит, громоздко, но хотелось бы элегантности.


Для галочки, не райнтайм: на GitHub раньше развивался lombok-pg, в котором yield был полноценно реализован приблизительно так же, как и yield в C# 2.0. Проект умер года два назад, вроде, плохо совместим с оригинальным Lombok, ну и, почти уверен, вообще не имеет поддержки со стороны IDE. Так что итератор.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.