canjs / can-map-define

Define rich attribute behavior
https://canjs.com/doc/can-map-define.html
MIT License
3 stars 2 forks source link

Add DefineMap's `.value()` behavior to can-map #96

Closed justinbmeyer closed 5 years ago

justinbmeyer commented 5 years ago

DefineMap's .value() makes it easy to isolate how a property behaves. We should add this to can-map for all the legacy folks to use.

We need a new name, I propose resolver similar to can-observe's resolver decorator:

https://canjs.com/doc/can-observe.resolver.html

CanMap.extend({
  define: {
    name: "string",
    nameChangedCount: {
      resolver( {listenTo, resolve} ){
        var count = resolve(0);
        listenTo("name", ()=>{  resolve(++count) })
      }
    }
  }
});

I think this might be as simple as changing:

https://github.com/canjs/can-map-define/blob/8838dc5c37e83779c054064edd22542d9e7bc98c/can-map-define.js#L365

To include something like:

var Resolver = require("can-simple-observable/resolver/resolver");

...

if (def.resolver) {
   mapHelpers.addComputedAttr(this, attr, new Resolver(def.resolver, this, def.value ) );
}