Skip to content

Commit a2a947b

Browse files
committed
Add Listeners utility class
1 parent baff604 commit a2a947b

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package org.scijava.listeners;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collection;
5+
import java.util.function.Consumer;
6+
7+
/**
8+
* A set of listeners of type {@code T}.
9+
*
10+
* @param <T>
11+
* listener type
12+
*/
13+
public interface Listeners< T >
14+
{
15+
/**
16+
* Add a listener to this set.
17+
*
18+
* @param listener
19+
* the listener to add.
20+
* @return {@code true} if the listener was added. {@code false} if it was
21+
* already present.
22+
*/
23+
boolean add( final T listener );
24+
25+
/**
26+
* Removes a listener from this set.
27+
*
28+
* @param listener
29+
* the listener to remove.
30+
* @return {@code true} if the listener was successfully removed.
31+
* {@code false} if the listener was not present.
32+
*/
33+
boolean remove( final T listener );
34+
35+
default boolean addAll( final Collection< ? extends T > listeners )
36+
{
37+
if ( listeners.isEmpty() )
38+
return false;
39+
return listeners.stream().map( this::add ).reduce( Boolean::logicalOr ).get();
40+
}
41+
42+
default boolean removeAll( final Collection< ? extends T > listeners )
43+
{
44+
if ( listeners.isEmpty() )
45+
return false;
46+
return listeners.stream().map( this::remove ).reduce( Boolean::logicalOr ).get();
47+
}
48+
49+
/**
50+
* Implements {@link Listeners} using an {@link ArrayList}.
51+
*/
52+
class List< T > implements Listeners< T >
53+
{
54+
private final Consumer< T > onAdd;
55+
56+
public List( final Consumer< T > onAdd )
57+
{
58+
this.onAdd = onAdd;
59+
}
60+
61+
public List()
62+
{
63+
this( o -> {} );
64+
}
65+
66+
public final ArrayList< T > list = new ArrayList<>();
67+
68+
@Override
69+
public boolean add( final T listener )
70+
{
71+
if ( !list.contains( listener ) )
72+
{
73+
list.add( listener );
74+
onAdd.accept( listener );
75+
return true;
76+
}
77+
return false;
78+
}
79+
80+
@Override
81+
public boolean remove( final T listener )
82+
{
83+
return list.remove( listener );
84+
}
85+
86+
public ArrayList< T > listCopy()
87+
{
88+
return new ArrayList<>( list );
89+
}
90+
}
91+
92+
/**
93+
* Extends {@link Listeners.List}, making {@code add} and {@code remove}
94+
* methods synchronized.
95+
*/
96+
class SynchronizedList< T > extends List< T >
97+
{
98+
public SynchronizedList( final Consumer< T > onAdd )
99+
{
100+
super( onAdd );
101+
}
102+
103+
public SynchronizedList()
104+
{
105+
super();
106+
}
107+
108+
@Override
109+
public synchronized boolean add( final T listener )
110+
{
111+
return super.add( listener );
112+
}
113+
114+
@Override
115+
public synchronized boolean remove( final T listener )
116+
{
117+
return super.remove( listener );
118+
}
119+
120+
@Override
121+
public synchronized ArrayList< T > listCopy()
122+
{
123+
return super.listCopy();
124+
}
125+
}
126+
}
127+

0 commit comments

Comments
 (0)