12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package frame
- import (
- "container/list"
- "fmt"
- )
- type RootFrame struct {
- inner list.List
- }
- func (f *RootFrame) Init() *RootFrame {
- f.inner = *list.New()
- return f
- }
- func (f *RootFrame) Push(frame Frame) {
- f.PushFor(frame, nil)
- }
- func (f *RootFrame) PushFor(frame, parent Frame) {
- _, ok := frame.(*RootFrame)
- if ok {
- panic("impossibru")
- }
- f.inner.PushFront(frame)
- frame.OnPush(f, parent)
- }
- func (f *RootFrame) Pop() {
- if f.inner.Front() != nil {
- elem := f.inner.Front()
- frame := elem.Value.(Frame)
- frame.OnPop()
- f.inner.Remove(elem)
- } else {
- panic("it's empty stack")
- }
- }
- func (f *RootFrame) Top() (frame Frame) {
- elem := f.inner.Front()
- if elem != nil {
- frame = elem.Value.(Frame)
- }
- return frame
- }
- func (f *RootFrame) Do() (res WAIT) {
- if f.Top() != nil {
- x := f.Top()
- //цикл дейкстры
- for {
- wait := x.Do()
- fmt.Println(wait)
- if wait == SKIP {
- break
- } else if wait == DO {
- } else if wait == WRONG {
- panic("something wrong")
- } else {
- if x == f.Top() {
- f.Pop()
- } else {
- panic("do not stop if not top on stack")
- }
- break
- }
- }
- }
- if f.Top() != nil {
- res = DO
- } else {
- res = STOP
- }
- return res
- }
- func (f *RootFrame) OnPush(a Stack, b Frame) {}
- func (f *RootFrame) OnPop() {}
- func (f *RootFrame) Parent() Frame { return nil }
- func (f *RootFrame) Root() Stack { return nil }
- func (w WAIT) String() string {
- switch w {
- case DO:
- return "DO"
- case SKIP:
- return "SKIP"
- case STOP:
- return "STOP"
- case WRONG:
- return "WRONG"
- default:
- panic("wrong wait value")
- }
- }
|