feed.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package feed
  2. import (
  3. "fmt"
  4. "servitor/pub"
  5. )
  6. type Feed struct {
  7. feed map[int]pub.Tangible
  8. // exclusive bounds
  9. upperBound int
  10. lowerBound int
  11. index int
  12. }
  13. func CreateEmpty() *Feed {
  14. return &Feed{
  15. feed: map[int]pub.Tangible{},
  16. upperBound: 0,
  17. lowerBound: 0,
  18. index: 0,
  19. }
  20. }
  21. func Create(input pub.Tangible) *Feed {
  22. return &Feed{
  23. feed: map[int]pub.Tangible{
  24. 0: input,
  25. },
  26. upperBound: 1,
  27. lowerBound: -1,
  28. index: 0,
  29. }
  30. }
  31. func CreateAndAppend(input []pub.Tangible) *Feed {
  32. f := &Feed{
  33. feed: map[int]pub.Tangible{},
  34. }
  35. f.upperBound = 1
  36. f.index = 1
  37. f.Append(input)
  38. return f
  39. }
  40. func (f *Feed) Append(input []pub.Tangible) {
  41. for i, element := range input {
  42. f.feed[f.upperBound+i] = element
  43. }
  44. f.upperBound += len(input)
  45. }
  46. func (f *Feed) Prepend(input []pub.Tangible) {
  47. for i, element := range input {
  48. f.feed[f.lowerBound-i] = element
  49. }
  50. f.lowerBound -= len(input)
  51. }
  52. func (f *Feed) Get(offset int) pub.Tangible {
  53. if !f.Contains(offset) {
  54. panic(fmt.Sprintf("indexing feed at %d whereas bounds are %d and %d", f.index+offset, f.lowerBound, f.upperBound))
  55. }
  56. return f.feed[f.index+offset]
  57. }
  58. func (f *Feed) Current() pub.Tangible {
  59. return f.feed[f.index]
  60. }
  61. func (f *Feed) MoveUp() {
  62. if f.Contains(-1) {
  63. f.index -= 1
  64. }
  65. }
  66. func (f *Feed) MoveDown() {
  67. if f.Contains(1) {
  68. f.index += 1
  69. }
  70. }
  71. func (f *Feed) MoveToCenter() {
  72. if f.Contains(-f.index) {
  73. f.index = 0
  74. }
  75. }
  76. func (f *Feed) Contains(offset int) bool {
  77. return f.index+offset < f.upperBound && f.index+offset > f.lowerBound
  78. }
  79. func (f *Feed) IsParent(offset int) bool {
  80. return f.index+offset < 0
  81. }
  82. func (f *Feed) IsChild(offset int) bool {
  83. return f.index+offset > 0
  84. }