package shsh

type Operation func(*Token) *Token

type Function struct {
    function Operation
    timesCalled int
    args   int
}

type FuncTable map[string]*Function

var (
    GlobalFuncTable *FuncTable
)

// TODO: Currently only checks arg list length
func ParseFunction(target *Function, args *Token) bool {
    // HANDLE EXEC
    if target.args < 0 {
        return true
    }

    i := target.args
    for iter := &args; *iter != nil; iter = &((*iter).next) {
        i -= 1
    }

    if i != 0 {
        // log error here?
        return false
    }

    return true
}

func CallFunction(target *Function, args *Token) *Token {
    if !ParseFunction(target, args) {
        return args
    }

    target.timesCalled += 1
    return target.function(args)
}

func GetFunction(arg string) *Function {
    target, ok := (*GlobalFuncTable)[arg]
    if !ok {
        // TODO: hook into stdlib exec call
        ;
    }

    return target
}
