github.com/tursom/GoCollections@v0.3.10/lang/ConvChannel.go (about) 1 /* 2 * Copyright (c) 2022 tursom. All rights reserved. 3 * Use of this source code is governed by a GPL-3 4 * license that can be found in the LICENSE file. 5 */ 6 7 package lang 8 9 import ( 10 "github.com/tursom/GoCollections/util/time" 11 ) 12 13 type ( 14 convChannel[T1, T2 any] struct { 15 channel Channel[T1] 16 recvConv func(T1) T2 17 sendConv func(T2) T1 18 } 19 20 convSendChannel[T1, T2 any] struct { 21 channel SendChannel[T1] 22 sendConv func(T2) T1 23 } 24 25 convReceiveChannel[T1, T2 any] struct { 26 channel ReceiveChannel[T1] 27 recvConv func(T1) T2 28 } 29 30 filterReceiveChannel[T any] struct { 31 ReceiveChannel[T] 32 filter func(T) bool 33 } 34 ) 35 36 func ConvChannel[T1, T2 any](c1 Channel[T1], recvConv func(T1) T2, sendConv func(T2) T1) ChannelProxy[T2, T1] { 37 return &convChannel[T1, T2]{c1, recvConv, sendConv} 38 } 39 40 func ConvSendChannel[T1, T2 any](c1 SendChannel[T1], sendConv func(T2) T1) SendChannelProxy[T2, T1] { 41 return &convSendChannel[T1, T2]{c1, sendConv} 42 } 43 44 func ConvReceiveChannel[T1, T2 any](c1 ReceiveChannel[T1], recvConv func(T1) T2) ReceiveChannelProxy[T2, T1] { 45 return &convReceiveChannel[T1, T2]{c1, recvConv} 46 } 47 48 func FilterReceiveChannel[T any](c1 ReceiveChannel[T], filter func(T) bool) ReceiveChannelProxy[T, T] { 49 return &filterReceiveChannel[T]{c1, filter} 50 } 51 52 func (c *convChannel[T1, T2]) Close() { 53 c.channel.Close() 54 } 55 56 func (c *convChannel[T1, T2]) SCh() chan<- T2 { 57 return nil 58 } 59 60 func (c *convChannel[T1, T2]) Send(obj T2) { 61 c.channel.Send(c.sendConv(obj)) 62 } 63 64 func (c *convChannel[T1, T2]) TrySend(obj T2) bool { 65 return c.channel.TrySend(c.sendConv(obj)) 66 } 67 68 func (c *convChannel[T1, T2]) SendTimeout(obj T2, timeout time.Duration) bool { 69 return c.channel.SendTimeout(c.sendConv(obj), timeout) 70 } 71 72 func (c *convChannel[T1, T2]) RCh() <-chan T2 { 73 return nil 74 } 75 76 func (c *convChannel[T1, T2]) Receive() (T2, bool) { 77 value, ok := c.channel.Receive() 78 if !ok { 79 return Nil[T2](), false 80 } 81 82 return c.recvConv(value), true 83 } 84 85 func (c *convChannel[T1, T2]) TryReceive() (T2, bool) { 86 obj, b := c.channel.TryReceive() 87 if !b { 88 return Nil[T2](), false 89 } 90 91 return c.recvConv(obj), true 92 } 93 94 func (c *convChannel[T1, T2]) ReceiveTimeout(timeout time.Duration) (T2, bool) { 95 obj, b := c.channel.ReceiveTimeout(timeout) 96 if !b { 97 return Nil[T2](), false 98 } 99 100 return c.recvConv(obj), true 101 } 102 103 func (c *convChannel[T1, T2]) Ch() chan T2 { 104 return nil 105 } 106 107 func (c *convChannel[T1, T2]) ProxySendChannel() SendChannel[T1] { 108 return c.channel 109 } 110 111 func (c *convChannel[T1, T2]) ProxyReceiveChannel() ReceiveChannel[T1] { 112 return c.channel 113 } 114 115 func (c *convChannel[T1, T2]) ProxyChannel() Channel[T1] { 116 return c.channel 117 } 118 119 func (c *convSendChannel[T1, T2]) Close() { 120 c.channel.Close() 121 } 122 123 func (c *convSendChannel[T1, T2]) SCh() chan<- T2 { 124 return nil 125 } 126 127 func (c *convSendChannel[T1, T2]) Send(obj T2) { 128 c.channel.Send(c.sendConv(obj)) 129 } 130 131 func (c *convSendChannel[T1, T2]) TrySend(obj T2) bool { 132 return c.channel.TrySend(c.sendConv(obj)) 133 } 134 135 func (c *convSendChannel[T1, T2]) SendTimeout(obj T2, timeout time.Duration) bool { 136 return c.channel.SendTimeout(c.sendConv(obj), timeout) 137 } 138 139 func (c *convSendChannel[T1, T2]) ProxySendChannel() SendChannel[T1] { 140 return c.channel 141 } 142 143 func (c *convReceiveChannel[T1, T2]) Close() { 144 c.channel.Close() 145 } 146 147 func (c *convReceiveChannel[T1, T2]) RCh() <-chan T2 { 148 return nil 149 } 150 151 func (c *convReceiveChannel[T1, T2]) Receive() (T2, bool) { 152 value, ok := c.channel.Receive() 153 if !ok { 154 return Nil[T2](), false 155 } 156 157 return c.recvConv(value), true 158 } 159 160 func (c *convReceiveChannel[T1, T2]) TryReceive() (T2, bool) { 161 obj, b := c.channel.TryReceive() 162 if !b { 163 return Nil[T2](), false 164 } 165 166 return c.recvConv(obj), true 167 } 168 169 func (c *convReceiveChannel[T1, T2]) ReceiveTimeout(timeout time.Duration) (T2, bool) { 170 obj, b := c.channel.ReceiveTimeout(timeout) 171 if !b { 172 return Nil[T2](), false 173 } 174 175 return c.recvConv(obj), true 176 } 177 178 func (c *convReceiveChannel[T1, T2]) ProxyReceiveChannel() ReceiveChannel[T1] { 179 return c.channel 180 } 181 182 func (c *filterReceiveChannel[T]) RCh() <-chan T { 183 return nil 184 } 185 186 func (f *filterReceiveChannel[T]) Receive() (T, bool) { 187 obj, _ := f.ReceiveChannel.Receive() 188 for !f.filter(obj) { 189 obj, _ = f.ReceiveChannel.Receive() 190 } 191 192 return obj, false 193 } 194 195 func (f *filterReceiveChannel[T]) TryReceive() (T, bool) { 196 obj, ok := f.ReceiveChannel.TryReceive() 197 if !ok { 198 return Nil[T](), false 199 } 200 201 for !f.filter(obj) { 202 obj, ok = f.ReceiveChannel.TryReceive() 203 if !ok { 204 return Nil[T](), false 205 } 206 } 207 208 return obj, true 209 } 210 211 func (f *filterReceiveChannel[T]) ReceiveTimeout(timeout time.Duration) (T, bool) { 212 t1 := time.Now() 213 214 obj, ok := f.ReceiveChannel.ReceiveTimeout(timeout) 215 if !ok { 216 return Nil[T](), false 217 } 218 219 for !f.filter(obj) { 220 duration := timeout - t1.Sub(time.Now()) 221 if duration <= 0 { 222 return Nil[T](), false 223 } 224 225 obj, ok = f.ReceiveChannel.ReceiveTimeout(duration) 226 if !ok { 227 return Nil[T](), false 228 } 229 } 230 231 return obj, true 232 } 233 234 func (f *filterReceiveChannel[T]) ProxyReceiveChannel() ReceiveChannel[T] { 235 return f.ReceiveChannel 236 }