Peek specification
Consume
Consume (channels: ChannelWithPeekFlag, continuation: C, persist: Boolean) (m: Match)->
- Fetch data residing on channels & look for match candidates
- If match:
- not found: store continuation with peek information
- found:
- return continuation
- For all match candidates: if not persist or not peek -> remove from tuplespace
Produce
Produce(channel: C, data: A, persist: Boolean)(m: Match)
- Fetch joined channels Seq[Seq[C]] for channel
- Look for all matching waiting continuation under each sequence of channels
- If match:
- Not found: store data under channel
- Found:
- return data (from all channels) & continuation with peek information
- If not persist -> remove continuation
- For channel C -> if it has the peek flag in the continuation: do not store it and return the peek flag to the user
- For data matching on other channels -> if data is flagged with persit or peek -> don’t remove it. Otherwise do. Do not return the peek flag
Examples:
C - channel
K - continuation
as in trait ISpace[F[_], C, P, E, A, R, K] {
T[continuations][data]
A)
Tuplespace is empty. T[][]
Consume with channels = (C1, peek = true), continuation = K1, persist = false -> K1((C1, peek), !persist)
After matching:
T[K1((C1, peek),!persist)][]
Returned: none
B)
T[K1((C1, peek),!persist)][]
Produce (channel = C1(v1), persist = false)
T[][]
R: COMM(K1, C1(v1), peek)
Produce (channel = C1(v1), persist = false)
T[][C1(v1, !persist)]
R: empty
C)
T[K1((C1, peek),!persist)][]
Consume((C1, peek), K2, false)
T[K1((C1, peek),!persist), K2((C1, peek),!persist)][]
R: empty
Produce(C1(v2), false)
T[K1((C1, peek),!persist)][]
R: COMM(K2, C1(v2), peek)
Produce(C1(v2), !persist)
T[][]
R: COMM(K1, C1(v2), peek)
Produce(C1(v2), !persist)
T[][C1(v2, !persist)]
R: empty
D)
T[[K1((C1, peek),!persist), K2((C1, !peek)],!persist)][]
Produce (channel = C1(v1), persist = false)
2 possibilities:
1)
T[K2((C1, !peek)][]
R: COMM(K1, C1(v2), peek)
Produce (channel = C1(v1), persist = false)
T[][]
R: COMM(K2, C1(v2))
2)
T[K1((C1, peek),!persist)][]
R: COMM(K2, C1(v2))
E)
T[K1([(C1, peek), (C2, !peek)], !persist)][C2(v2, !persist)]
Produce (channel = C1(v1), persist = false)
T[][]
R: COMM(K1, C1(v1), C2(v2), peek)
Produce (channel = C1(v1), persist = false)
T[][C1(v1, !persist)]
R: empty
F)
T[K1([(C1, peek), (C2, peek)], !persist)][C2(v2, !persist)]
Produce (channel = C1(v1), persist = false)
T[][C2(v2, !persist)]
R: COMM(K1, C1(v1), C2(v2),peek)
Produce (channel = C1(v1), persist = false)
T[][C1(v1, !persist), C2(v2, !persist)]
R: empty