// Path: examples/async/src/main/java/com/sulaco/fuse/example/async/domain/entity/Playlist.java
// public class Playlist {
// 
//     UUID id;
//     Set<Song> songs;
// 
//     public Playlist() {
//         this.songs = new HashSet<>();
//     }
// 
//     public Playlist(UUID id) {
//         this();
//         this.id = id;
//     }
// 
//     public UUID getId() {
//         return id;
//     }
// 
//     public Set<Song> getSongs() {
//         return songs;
//     }
// 
//     public void addSong(Song song) {
//         this.songs.add(song);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Playlist)) return false;
// 
//         Playlist playlist = (Playlist) o;
// 
//         if (!id.equals(playlist.id)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return id != null ? id.hashCode() : 0;
//     }
// 
//     public static final Playlist EMPTY = new Playlist();
// }
// 
// Path: examples/async/src/main/java/com/sulaco/fuse/example/async/domain/entity/Song.java
// public class Song {
// 
//     UUID id;
// 
//     String artist;
// 
//     String album;
// 
//     String title;
// 
//     int length;
// 
//     public UUID getId() {
//         return id;
//     }
// 
//     public void setId(UUID id) {
//         this.id = id;
//     }
// 
//     public int getLength() {
//         return length;
//     }
// 
//     public void setLength(int length) {
//         this.length = length;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public void setTitle(String title) {
//         this.title = title;
//     }
// 
//     public String getAlbum() {
//         return album;
//     }
// 
//     public void setAlbum(String album) {
//         this.album = album;
//     }
// 
//     public String getArtist() {
//         return artist;
//     }
// 
//     public void setArtist(String artist) {
//         this.artist = artist;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Song)) return false;
// 
//         Song song = (Song) o;
// 
//         if (!id.equals(song.id)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return id.hashCode();
//     }
// 
//     public static Song EMPTY = new Song();
// }


import com.datastax.driver.core.*;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.sulaco.fuse.example.async.domain.entity.Playlist;
import com.sulaco.fuse.example.async.domain.entity.Song;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.function.Function;
            = session.executeAsync(
                stmt_get_song.bind(UUID.fromString(id))
            );

        consumeRowAsync(future, this::songFromRow, consumer);
    }

    @Override
    public void getPlaylistById(String id, Function<Optional<?>, ?> consumer) {

        ResultSetFuture future
            = session.executeAsync(
                stmt_get_playlist.bind(UUID.fromString(id))
            );

        consumeRowsAsync(future, rs -> playlistFromRows(id, rs), consumer);
    }

    Optional<Playlist> playlistFromRows(String id, Optional<List<Row>> rows) {

        Playlist playlist = new Playlist(UUID.fromString(id));
        rows.ifPresent(
            list -> list.forEach(
                        row -> playlist.addSong(songFromRow(row))
                    )
        );

        return Optional.of(playlist);
    }

// Path: examples/async/src/main/java/com/sulaco/fuse/example/async/domain/entity/Playlist.java
// public class Playlist {
// 
//     UUID id;
//     Set<Song> songs;
// 
//     public Playlist() {
//         this.songs = new HashSet<>();
//     }
// 
//     public Playlist(UUID id) {
//         this();
//         this.id = id;
//     }
// 
//     public UUID getId() {
//         return id;
//     }
// 
//     public Set<Song> getSongs() {
//         return songs;
//     }
// 
//     public void addSong(Song song) {
//         this.songs.add(song);
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Playlist)) return false;
// 
//         Playlist playlist = (Playlist) o;
// 
//         if (!id.equals(playlist.id)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return id != null ? id.hashCode() : 0;
//     }
// 
//     public static final Playlist EMPTY = new Playlist();
// }
// 
// Path: examples/async/src/main/java/com/sulaco/fuse/example/async/domain/entity/Song.java
// public class Song {
// 
//     UUID id;
// 
//     String artist;
// 
//     String album;
// 
//     String title;
// 
//     int length;
// 
//     public UUID getId() {
//         return id;
//     }
// 
//     public void setId(UUID id) {
//         this.id = id;
//     }
// 
//     public int getLength() {
//         return length;
//     }
// 
//     public void setLength(int length) {
//         this.length = length;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public void setTitle(String title) {
//         this.title = title;
//     }
// 
//     public String getAlbum() {
//         return album;
//     }
// 
//     public void setAlbum(String album) {
//         this.album = album;
//     }
// 
//     public String getArtist() {
//         return artist;
//     }
// 
//     public void setArtist(String artist) {
//         this.artist = artist;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (!(o instanceof Song)) return false;
// 
//         Song song = (Song) o;
// 
//         if (!id.equals(song.id)) return false;
// 
//         return true;
//     }
// 
//     @Override
//     public int hashCode() {
//         return id.hashCode();
//     }
// 
//     public static Song EMPTY = new Song();
// }


// Path: examples/async/src/main/java/com/sulaco/fuse/example/async/domain/dao/CassandraDaoImpl.java
import com.datastax.driver.core.*;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.sulaco.fuse.example.async.domain.entity.Playlist;
import com.sulaco.fuse.example.async.domain.entity.Song;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.function.Function;

            = session.executeAsync(
                stmt_get_song.bind(UUID.fromString(id))
            );

        consumeRowAsync(future, this::songFromRow, consumer);
    }

    @Override
    public void getPlaylistById(String id, Function<Optional<?>, ?> consumer) {

        ResultSetFuture future
            = session.executeAsync(
                stmt_get_playlist.bind(UUID.fromString(id))
            );

        consumeRowsAsync(future, rs -> playlistFromRows(id, rs), consumer);
    }

    Optional<Playlist> playlistFromRows(String id, Optional<List<Row>> rows) {

        Playlist playlist = new Playlist(UUID.fromString(id));
        rows.ifPresent(
            list -> list.forEach(
                        row -> playlist.addSong(songFromRow(row))
                    )
        );

        return Optional.of(playlist);
    }

    Optional<Song> songFromRow(Optional<Row> row) {