ml.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package module
  2. import (
  3. mod "cp/module"
  4. "os"
  5. "rt2/context"
  6. "xev"
  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) Load(name string) (*mod.Module, error) {
  42. assert.For(name != "", 20)
  43. ret := l.Loaded(name)
  44. if ret == nil {
  45. path, _ := os.Getwd()
  46. ret = xev.Load(path, name+".oxf")
  47. l.inner[name] = ret
  48. }
  49. return ret, nil
  50. }
  51. func (l *list) Loaded(name string) *mod.Module {
  52. assert.For(name != "", 20)
  53. return l.inner[name]
  54. }
  55. func DomainModule(d context.Domain) *mod.Module {
  56. uni := d.Discover(context.UNIVERSE).(context.Domain)
  57. name := uni.Id(d)
  58. ml := uni.Discover(context.MOD).(List)
  59. return ml.Loaded(name)
  60. }