mutable.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package rx
  2. type Mutable interface {
  3. Get() Observable
  4. Set(Object) Observable
  5. Update(func(Object)(Object)) Observable
  6. }
  7. type MutableImpl struct {
  8. value Object
  9. }
  10. func CreateMutable(initial Object) Mutable {
  11. return &MutableImpl { initial }
  12. }
  13. func (c *MutableImpl) Get() Observable {
  14. return NewSync(func() (Object, bool) {
  15. return c.value, true
  16. })
  17. }
  18. func (c *MutableImpl) Set(new_val Object) Observable {
  19. return NewSync(func() (Object, bool) {
  20. c.value = new_val
  21. return nil, true
  22. })
  23. }
  24. func (c *MutableImpl) Update(f func(Object)(Object)) Observable {
  25. return NewSync(func() (Object, bool) {
  26. c.value = f(c.value)
  27. return nil, true
  28. })
  29. }
  30. type StringHashMap map[string] Object
  31. func CreateStringHashMap(m map[string] Object) StringHashMap {
  32. return StringHashMap(m)
  33. }
  34. func (m StringHashMap) Has(key string) Observable {
  35. return NewSync(func()(Object, bool) {
  36. var _, exists = m[key]
  37. return exists, true
  38. })
  39. }
  40. func (m StringHashMap) Get(key string) Observable {
  41. return NewSync(func()(Object, bool) {
  42. var val, exists = m[key]
  43. if exists {
  44. return Optional { true, val }, true
  45. } else {
  46. return Optional {}, true
  47. }
  48. })
  49. }
  50. func (m StringHashMap) Set(key string, val Object) Observable {
  51. return NewSync(func()(Object, bool) {
  52. m[key] = val
  53. return nil, true
  54. })
  55. }
  56. func (m StringHashMap) Delete(key string) Observable {
  57. return NewSync(func()(Object, bool) {
  58. var deleted, exists = m[key]
  59. if exists {
  60. delete(m, key)
  61. return Optional { true, deleted }, true
  62. } else {
  63. return Optional {}, true
  64. }
  65. })
  66. }
  67. type NumberHashMap map[uint] Object
  68. func CreateNumberHashMap(m map[uint] Object) NumberHashMap {
  69. return NumberHashMap(m)
  70. }
  71. func (m NumberHashMap) Has(key uint) Observable {
  72. return NewSync(func()(Object, bool) {
  73. var _, exists = m[key]
  74. return exists, true
  75. })
  76. }
  77. func (m NumberHashMap) Get(key uint) Observable {
  78. return NewSync(func()(Object, bool) {
  79. var val, exists = m[key]
  80. if exists {
  81. return Optional { true, val }, true
  82. } else {
  83. return Optional {}, true
  84. }
  85. })
  86. }
  87. func (m NumberHashMap) Set(key uint, val Object) Observable {
  88. return NewSync(func()(Object, bool) {
  89. m[key] = val
  90. return nil, true
  91. })
  92. }
  93. func (m NumberHashMap) Delete(key uint) Observable {
  94. return NewSync(func()(Object, bool) {
  95. var deleted, exists = m[key]
  96. if exists {
  97. delete(m, key)
  98. return Optional { true, deleted }, true
  99. } else {
  100. return Optional {}, true
  101. }
  102. })
  103. }
  104. type Buffer struct {
  105. data *([] byte)
  106. }
  107. func CreateBuffer(capacity uint) Buffer {
  108. var data = make([] byte, 0, capacity)
  109. return Buffer { &data }
  110. }
  111. func (buf Buffer) Write(bytes ([] byte)) Observable {
  112. return NewSync(func() (Object, bool) {
  113. *buf.data = append(*buf.data, bytes...)
  114. return nil, true
  115. })
  116. }
  117. func (buf Buffer) Dump() Observable {
  118. return NewGoroutine(func(sender Sender) {
  119. var dumped = make([] byte, len(*buf.data))
  120. copy(dumped, *buf.data)
  121. sender.Next(dumped)
  122. sender.Complete()
  123. })
  124. }