// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/entity/Changes.java
// public final class Changes<E extends Entity<E>> {
//     private final CreationChange<E> creationChange;
//     private final List<UpdateChange<E>> changes;
// 
//     public Changes(List<Change<E>> changes) {
//         assert changes.size() > 0;
//         assert changes.get(0) instanceof CreationChange;
//         creationChange = (CreationChange<E>) changes.get(0);
//         this.changes = changes.stream().skip(1).map(change -> (UpdateChange<E>) change).collect(Collectors.toList());
//     }
// 
//     public CreationChange<E> getCreationChange() {
//         return creationChange;
//     }
// 
//     public List<UpdateChange<E>> getUpdateChanges() {
//         return changes;
//     }
// 
//     public List<Change<E>> getAsList() {
//         return ImmutableList.<Change<E>>builder().add(creationChange).addAll(changes).build();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         Changes<?> changes1 = (Changes<?>) o;
//         return Objects.equals(changes, changes1.changes);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(changes);
//     }
// 
//     @Override
//     public String toString() {
//         return "Changes{" +
//                 "changes=" + changes +
//                 '}';
//     }
// }
// 
// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/entity/Entity.java
// public interface Entity<E extends Entity<E>> {
// 
//     Id<E> getId();
// 
//     /**
//      * @return and immutable state of the entity
//      */
//     EntityState<E> getState();
// 
//     /**
//      * @return immutable entity properties.
//      */
//     EntityProperties<E> getProperties();
// 
//     /**
//      * @return the version of the entity sate.
//      */
//     Version getVersion();
// 
// }
// 
// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/common/Id.java
// public interface Id<T> {
// }


import pl.marekpazik.state_synchronisation.entity.Changes;
import pl.marekpazik.state_synchronisation.entity.Entity;
import pl.marekpazik.state_synchronisation.common.Id;
package pl.marekpazik.state_synchronisation;


public interface ChangesStore {

    <E extends Entity<E>> Changes<E> getAllChanges(Id<E> id);

    /**
     * All changes have to be saved to this store.
     */
// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/entity/Changes.java
// public final class Changes<E extends Entity<E>> {
//     private final CreationChange<E> creationChange;
//     private final List<UpdateChange<E>> changes;
// 
//     public Changes(List<Change<E>> changes) {
//         assert changes.size() > 0;
//         assert changes.get(0) instanceof CreationChange;
//         creationChange = (CreationChange<E>) changes.get(0);
//         this.changes = changes.stream().skip(1).map(change -> (UpdateChange<E>) change).collect(Collectors.toList());
//     }
// 
//     public CreationChange<E> getCreationChange() {
//         return creationChange;
//     }
// 
//     public List<UpdateChange<E>> getUpdateChanges() {
//         return changes;
//     }
// 
//     public List<Change<E>> getAsList() {
//         return ImmutableList.<Change<E>>builder().add(creationChange).addAll(changes).build();
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         Changes<?> changes1 = (Changes<?>) o;
//         return Objects.equals(changes, changes1.changes);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(changes);
//     }
// 
//     @Override
//     public String toString() {
//         return "Changes{" +
//                 "changes=" + changes +
//                 '}';
//     }
// }
// 
// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/entity/Entity.java
// public interface Entity<E extends Entity<E>> {
// 
//     Id<E> getId();
// 
//     /**
//      * @return and immutable state of the entity
//      */
//     EntityState<E> getState();
// 
//     /**
//      * @return immutable entity properties.
//      */
//     EntityProperties<E> getProperties();
// 
//     /**
//      * @return the version of the entity sate.
//      */
//     Version getVersion();
// 
// }
// 
// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/common/Id.java
// public interface Id<T> {
// }


// Path: state-synchronization-api/src/main/java/pl/marekpazik/state_synchronisation/ChangesStore.java
import pl.marekpazik.state_synchronisation.entity.Changes;
import pl.marekpazik.state_synchronisation.entity.Entity;
import pl.marekpazik.state_synchronisation.common.Id;

package pl.marekpazik.state_synchronisation;


public interface ChangesStore {

    <E extends Entity<E>> Changes<E> getAllChanges(Id<E> id);

    /**
     * All changes have to be saved to this store.
     */
    <E extends Entity<E>> void saveChange(Id<E> id, Change<E> change);