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  }