ml.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package module
  2. import (
  3. mod "fw/cp/module"
  4. "fw/rt2/context"
  5. "fw/xev"
  6. "os"
  7. "ypk/assert"
  8. )
  9. type List interface {
  10. context.ContextAware
  11. AsList() []*mod.Module
  12. Load(name string) (*mod.Module, error)
  13. Loaded(name string) *mod.Module
  14. }
  15. func New() List {
  16. return new(list).init()
  17. }
  18. type list struct {
  19. inner map[string]*mod.Module
  20. d context.Domain
  21. }
  22. func (l *list) init() *list {
  23. l.inner = make(map[string]*mod.Module)
  24. return l
  25. }
  26. func (l *list) AsList() (ret []*mod.Module) {
  27. if len(l.inner) > 0 {
  28. ret = make([]*mod.Module, 0)
  29. }
  30. for _, v := range l.inner {
  31. ret = append(ret, v)
  32. }
  33. return ret
  34. }
  35. func (l *list) Domain() context.Domain {
  36. return l.d
  37. }
  38. func (l *list) Init(d context.Domain) {
  39. l.d = d
  40. }
  41. func (l *list) Handle(msg interface{}) {}
  42. func (l *list) Load(name string) (*mod.Module, error) {
  43. assert.For(name != "", 20)
  44. ret := l.Loaded(name)
  45. if ret == nil {
  46. path, _ := os.Getwd()
  47. ret = xev.Load(path, name+".oxf")
  48. l.inner[name] = ret
  49. }
  50. return ret, nil
  51. }
  52. func (l *list) Loaded(name string) *mod.Module {
  53. assert.For(name != "", 20)
  54. return l.inner[name]
  55. }
  56. func DomainModule(d context.Domain) *mod.Module {
  57. uni := d.Discover(context.UNIVERSE).(context.Domain)
  58. name := uni.Id(d)
  59. ml := uni.Discover(context.MOD).(List)
  60. return ml.Loaded(name)
  61. }