items.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package items
  2. import (
  3. "container/list"
  4. "ypk/assert"
  5. "ypk/halt"
  6. )
  7. type Key interface {
  8. EqualTo(Key) int
  9. }
  10. type Value interface {
  11. KeyOf(...Key) Key
  12. }
  13. type Link interface {
  14. To() Key
  15. Value
  16. }
  17. type Item interface {
  18. Data(...interface{}) interface{}
  19. Value
  20. Copy(Item)
  21. }
  22. type Data interface {
  23. Set(Key, Item)
  24. Link(Key, Key)
  25. Get(Key) Item
  26. Limit()
  27. Drop()
  28. }
  29. func New() Data {
  30. return &data{x: list.New()}
  31. }
  32. type data struct {
  33. x *list.List
  34. }
  35. func (d *data) find(k Key, from *list.Element) (ret Value, elem *list.Element) {
  36. if from == nil {
  37. from = d.x.Front()
  38. }
  39. for x := from; x != nil && ret == nil; x = x.Next() {
  40. if v, ok := x.Value.(Value); ok {
  41. if z := v.KeyOf().EqualTo(k); z == 0 {
  42. ret = v
  43. }
  44. }
  45. }
  46. return
  47. }
  48. func (d *data) Set(k Key, v Item) {
  49. assert.For(v != nil, 20)
  50. assert.For(v.KeyOf() == nil, 21)
  51. x, _ := d.find(k, nil)
  52. if x == nil {
  53. v.KeyOf(k)
  54. d.x.PushFront(v)
  55. } else {
  56. halt.As(123)
  57. }
  58. }
  59. func (d *data) Get(k Key) (ret Item) {
  60. for x, e := d.find(k, nil); x != nil && ret == nil; {
  61. switch v := x.(type) {
  62. case nil: //do nothing
  63. case Item:
  64. ret = v
  65. case Link:
  66. x, e = d.find(v.To(), e)
  67. }
  68. }
  69. return
  70. }
  71. type link struct {
  72. k, t Key
  73. }
  74. func (l *link) KeyOf(k ...Key) Key {
  75. if len(k) == 1 {
  76. l.k = k[0]
  77. }
  78. return l.k
  79. }
  80. func (l *link) To() Key {
  81. return l.t
  82. }
  83. func (d *data) Link(key Key, to Key) {
  84. v, _ := d.find(key, nil)
  85. if v == nil {
  86. d.x.PushFront(&link{k: key, t: to})
  87. } else {
  88. halt.As(123)
  89. }
  90. }
  91. type limit struct{}
  92. type limit_key struct{}
  93. func (l *limit_key) EqualTo(Key) int { return -1 }
  94. func (l *limit) KeyOf(...Key) Key { return &limit_key{} }
  95. func (d *data) Limit() { d.x.PushFront(&limit{}) }
  96. func (d *data) Drop() {
  97. panic(0)
  98. }