On Mon, 26 Sep 2016 16:24:36 -0300 Gustavo Sverzut Barbieri <barbi...@gmail.com> said:
> On Fri, Sep 23, 2016 at 11:03 PM, Carsten Haitzler <ras...@rasterman.com> > wrote: > > On Wed, 21 Sep 2016 11:10:00 -0300 Gustavo Sverzut Barbieri > > <barbi...@gmail.com> said: > > > >> On Wed, Sep 21, 2016 at 5:26 AM, Tom Hacohen <t...@osg.samsung.com> wrote: > >> [...] > >> >> promise/future should be first-class citizen... as well as iterator > >> >> and the likes. There is a start already, but refinement is really > >> >> needed, like returning an iterator<x> should handle warn_unused, free, > >> >> own... Promise should have its own callback signature, simplified for > >> >> the user. > >> >> > >> > > >> > They can, be, but they will just be provided by Eo. There's no need for > >> > any special treatment in Eo. > >> > > >> > Promise signature: you don't need to do it in Eo. I mean, you can add a > >> > special type in Eolian, but Eo itself need not be aware. Also, I > >> > disagree. > >> > >> Do you mean still use Eo's events to dispatch promises? > > > > yes. when we had eina_promises i instantly just c&p'd the eo event cb to > > write a success and failure handler and "boom type mismatch" ... wtf? i now > > had to go look it up. PAIN POINT right out of the box. > > > > 90% of the time people only will care about success or failure. the other > > 10% they want the value IN the promise. you can get that from the eo event > > info. i actually think you just should "get" the value from the promise > > object anyway as it stores it... > > why is that? I know our APIs, particularly Evas and Elementary worked > around the 'void *event' signatures by producing no "value" in the > callback, instead forcing you to query that yourself. Like "canvas > resized", then you must query the information "whats the new size?". > > But if promise delivers the result in a nice way, we should be > providing more values as payload. promises do deliver values in the event info. in there... but i just dislike this when you can query the promise itself for that in the cb or at any time in the same way inside or outside that cb. > >> I don't get why Efl.Promise is an Eo at all. Looking at the code shows > >> now hints of benefits. Asking Cedric leads me to an awful answer... > >> :-/ > > > > because when it was an eina_promise it did everything an eo object did. it > > had event callbacks (succeed/fail), it had progress event callbacks, it > > stored values, could be ref and unreffed, and more and more. it looked > > exactly like an eo object but just was an eina promise with its own custom > > api instead. it just made no sense. there is a whole big long thread on > > this in history you missed. you might weant to go back a few months for > > "promises" subjects and see. > > this is because, in my opinion, they tried to do too much for too > little value. Allowing multiple then callbacks for a single promise is > like that, you need a list of promises, you need to keep account if > you're walking the list... if the promise was deleted from a cb, etc. well the referencing was needed so you can cancel a promise as you now need to store it as an object/handle to access later to cancel it. so cancellation really created the need for it to be an object. so it shouldbe a real object, so if i delete the promise it is canceled and then i can attach it as a child object to my parent so if parent is deleted the promise is too thus cancelling the action i no longer need with no extra code from me. :) > if it was kept simple as in other implementations "1 promise = 1 then > + 1 error", it would be much, much simpler. There is no ref, no > unref... If an object returns a promise, the object itself will have > to keep the pointer to deliver an output value (even if "void", to say > it was fulfilled), thus you know when you get cancelled, and you know > when you fulfill or reject. > > There are 2 PoV to that: promise returners and users. > > returners, or objects that return a promise, will create it and either > fulfill or or reject it. They can pass one CB to be informed if the > user cancelled the promise as its not needed anymore. The returner > does all the memory allocation and free. > > users are those that do "then" and "else" (or "on error"). Then is > called upon fulfillment. Else (or on error) is called upon rejection. > The only operation an user can do on a promise is to cancel it (which > will report back to "returner" as per above). No memory management on > the promise itself is done. Calling "cancel" will call its own > "else/on error". and this is what REALLY necessitates an object. promises are objects in js for example. actually. i don't want to re-hash this thread. go back to the original one on promises. :) > >> The promise thing should only be a thin layer that forces a clear > >> pattern: wait for data, deliver data or call failure. I don't get why > >> in the other thread people were talking about references in promises, > >> inheritance, etc. > > > > that's not what they were. they were full on objects with referencing and > > lifetimes etc. and reality is they actually need to be as you need to keep > > the promise handle around so you ca CANCEL it. there are cancel methods. > > this requires a lifetime and referencing. thus. eo objects. > > not really, see above. > > The API for promise returner is simple 3 methods: > > Efl_Promise *efl_promise_new(); > efl_promise_fulfill(p, value); //does free > efl_promise_reject(p, error); //does free > > The API for promise user is also simple: > > Efl_Promise *efl_promise_then(p, on_fulfill, on_reject, data); > void efl_promise_cancel(p); //calls efl_promise_reject() and thus > on_reject() and frees the data. > > no ref/unref, nothing complex. If there is a single CB per promise, > then its simple. If there are multiple CBs as Felipe/Cedric want, > you'd need to keep a "walking" counter + deleted flags to avoid > messing with the list while its being walked. I don't think its worth. > > > >> While the API is what it should be, it's PITA to use. If we could > >> extend the generator to do those for us, we'd have to implement only > >> high level functions. Like it does for C++ or Lua bindings, do to C > >> "user code" (could also do C++/Lua user code as well). Example: > >> > >> myapp.eou: # eou = eo user > >> > >> objects { > >> xpto { /* creates an object called "xpto" */ > >> children { > >> window { /* window is part of xpto, it will be created using > >> given type and properties */ > >> type: Efl.Ui.Win; > >> constructor { > >> type: Efl.Ui.Win.Type.basic; > >> title: "hello world"; > >> } > >> events { /* these will be connected for you, callback > >> handlers are expanded based on event payload */ > >> resized @proxy; /* proxy = will forward this event as > >> "xpto" using the same name */ > >> delete,request; /* user must implement the callback > >> with handler */ > >> } > >> } > >> box { > >> type: Efl.Ui.Box; > >> } > >> label1 { > >> type: Efl.Ui.Label; > >> } > >> label2 { > >> type: Efl.Ui.Label; > >> } > >> entry { > >> type: Efl.Ui.Entry; > >> } > >> } > >> > >> connections { > >> entry: changed -> label2: text.set; /* somehow like Qt's > >> signal connection */ > >> } > >> > >> composition { /* basic method calls using other objects and > >> constants */ box.pack_align(0.5, 0.5); > >> > >> label1.hint_align.set(0.0, 0.0); > >> box.pack(label1); > >> > >> label2.hint_align.set(1.0, 1.0); > >> box.pack(label2); > >> box.pack(entry); > >> } > >> } > >> } > > > > yeah,. you want a special ui layout language that compile to c :) it could > > do mroe than just declarative ui and glue in callbacks like promises etc. - > > it would need to glue in event cb's anyway for clicked or changed events on > > widgets. but this is orthogonal to promises. > > indeed its orthogonal to promises. But it's not an UI description > language, its to save me from typing and doing errors, resolving all > the class hierarchy myself. > > you could as easily read that GUI example as network, where you create > an input, output and a copier, link them together, configure some > properties and then have it to be executed. > > > -- > Gustavo Sverzut Barbieri > -------------------------------------- > Mobile: +55 (16) 99354-9890 > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel