ml.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package module
  2. import (
  3. "fmt"
  4. mod "fw/cp/module"
  5. "fw/rt2/context"
  6. "fw/xev"
  7. "os"
  8. "ypk/assert"
  9. )
  10. type Loader func(*mod.Module)
  11. type List interface {
  12. context.ContextAware
  13. AsList() []*mod.Module
  14. Load(string, ...Loader) (*mod.Module, error)
  15. Loaded(string) *mod.Module
  16. }
  17. func New() List {
  18. return new(list).init()
  19. }
  20. type list struct {
  21. inner map[string]*mod.Module
  22. d context.Domain
  23. }
  24. func (l *list) init() *list {
  25. l.inner = make(map[string]*mod.Module)
  26. return l
  27. }
  28. func (l *list) AsList() (ret []*mod.Module) {
  29. if len(l.inner) > 0 {
  30. ret = make([]*mod.Module, 0)
  31. }
  32. for _, v := range l.inner {
  33. ret = append(ret, v)
  34. }
  35. return ret
  36. }
  37. func (l *list) Domain() context.Domain {
  38. return l.d
  39. }
  40. func (l *list) Init(d context.Domain) {
  41. l.d = d
  42. }
  43. func (l *list) Handle(msg interface{}) {}
  44. func (l *list) Load(name string, ldr ...Loader) (ret *mod.Module, err error) {
  45. assert.For(name != "", 20)
  46. fmt.Println("loading", name, "loaded", l.Loaded(name) != nil)
  47. ret = l.Loaded(name)
  48. var loader Loader = func(m *mod.Module) {}
  49. if len(ldr) > 0 {
  50. loader = ldr[0]
  51. }
  52. if ret == nil {
  53. path, _ := os.Getwd()
  54. ret = xev.Load(path, name+".oz")
  55. ret.Name = name
  56. for _, imp := range ret.Imports {
  57. fmt.Println("imports", imp.Name, "loaded", l.Loaded(imp.Name) != nil)
  58. _, err = l.Load(imp.Name, loader)
  59. }
  60. if err == nil {
  61. l.inner[name] = ret
  62. loader(ret)
  63. fmt.Println("loaded", name)
  64. }
  65. }
  66. return ret, err
  67. }
  68. func (l *list) Loaded(name string) *mod.Module {
  69. assert.For(name != "", 20)
  70. return l.inner[name]
  71. }
  72. func DomainModule(d context.Domain) *mod.Module {
  73. uni := d.Discover(context.UNIVERSE).(context.Domain)
  74. name := uni.Id(d)
  75. assert.For(name != "", 40)
  76. ml := uni.Discover(context.MOD).(List)
  77. return ml.Loaded(name)
  78. }