diff --git a/src/apatheia.nim b/src/apatheia.nim new file mode 100644 index 0000000..adca2c3 --- /dev/null +++ b/src/apatheia.nim @@ -0,0 +1,3 @@ + +import apatheia/tasks +export tasks \ No newline at end of file diff --git a/src/apatheia/buffers.nim b/src/apatheia/buffers.nim deleted file mode 100644 index e69de29..0000000 diff --git a/src/apatheia/macroutils.nim b/src/apatheia/macroutils.nim new file mode 100644 index 0000000..b38c4f8 --- /dev/null +++ b/src/apatheia/macroutils.nim @@ -0,0 +1,116 @@ +import std/[tables, strutils, typetraits, macros] + +proc makeProcName*(s: string): string = + result = "" + for c in s: + if c.isAlphaNumeric: result.add c + +proc hasReturnType*(params: NimNode): bool = + if params != nil and params.len > 0 and params[0] != nil and + params[0].kind != nnkEmpty: + result = true + +proc firstArgument*(params: NimNode): (NimNode, NimNode) = + if params != nil and + params.len > 0 and + params[1] != nil and + params[1].kind == nnkIdentDefs: + result = (ident params[1][0].strVal, params[1][1]) + else: + result = (ident "", newNimNode(nnkEmpty)) + +iterator paramsIter*(params: NimNode): tuple[name, ntype: NimNode] = + for i in 1 ..< params.len: + let arg = params[i] + let argType = arg[^2] + for j in 0 ..< arg.len-2: + yield (arg[j], argType) + +proc identPub*(name: string): NimNode = + result = nnkPostfix.newTree(newIdentNode("*"), ident name) + +proc signalTuple*(sig: NimNode): NimNode = + let otp = nnkEmpty.newTree() + # echo "signalObjRaw:sig1: ", sig.treeRepr + let sigTyp = + if sig.kind == nnkSym: sig.getTypeInst + else: sig.getTypeInst + # echo "signalObjRaw:sig2: ", sigTyp.treeRepr + let stp = + if sigTyp.kind == nnkProcTy: + sig.getTypeInst[0] + else: + sigTyp.params() + let isGeneric = false + + # echo "signalObjRaw:obj: ", otp.repr + # echo "signalObjRaw:obj:tr: ", otp.treeRepr + # echo "signalObjRaw:obj:isGen: ", otp.kind == nnkBracketExpr + # echo "signalObjRaw:sig: ", stp.repr + + var args: seq[NimNode] + for i in 2..