diff --git a/README.md b/README.md
index b42ef99..81999fc 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ The following methods are availble to all Objects via protoype inheritence, unle
| [`[@@iterator]`](docs/api.md#iterator) | Iterate through values of `this` |
| [`clean`](docs/api.md#clean) | Return a copy of `this` without falsey entries |
| [`filter`](docs/api.md#filter) | Create a copy of `this` with only entries that match a filter function |
-| [`find`](docs/api.md#find) | Find keys of `this` which match a function |
+| [`find`](docs/api.md#find) | Find keys of `this` which match a function or value |
| [`assign`](docs/api.md#assign) | Assign new properties to `this` |
| [`extend`](docs/api.md#extend) | Assign default properties to `this` |
| [`same`](docs/api.md#same) | Return new object like `this` with properties shared with another |
@@ -57,7 +57,6 @@ The following methods are availble to all Objects via protoype inheritence, unle
| [`delete`](docs/api.md#delete) | Remove keys from `this` |
| [`some`](docs/api.md#some) | Test a function against at least one entry of `this` |
| [`every`](docs/api.md#every) | Test a function against all entries of `this` |
-| [`has`](docs/api.md#has) | Lookup key of `this` by value |
| [`at`](docs/api.md#at) | Lookup value by key path |
| [`$`](docs/api.md#fmt) | Coerce `this` into a string with configurable formatting |
| [`clone`](docs/api.md#clone) | Clone `this` with configurable depths |
diff --git a/docs/api.md b/docs/api.md
index d66cdc8..5b644fb 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -169,16 +169,18 @@ var o = { a: 1, b: 2 }.filter(v => v > 2) // {}
-## `Object..find(function)`
+## `Object..find(test)`
-Return first key of `this` where value passes function
-Function takes value and key as arguments.
+If `test` is a function, Return first key of `this` which passes `test` where `test` takes each value and key as arguments. If `test` is not a function then return the first key of `this` where the value equals `test` (using `value.eq(test)`)
```javascript
var o = { a: 1, b: 2 }.find(v => v > 1) // 'b'
var o = { a: 1, b: 2 }.find(v => v > 2) // null
+var o = { a: 1, b: 2 }.find(2) // b
+var o = { a: 1, b: 2 }.find(0) // undefined
+
```
@@ -286,23 +288,6 @@ var o = { a: 1, b: 2 }.every(v => v > 1) // false
-
-
-## `Object..has(value)`
-
-Returns first key of `this` where the value equals the argument, otherwise undefined.
-
-
-
-```javascript
-var o = { a: 1, b: 2 }.has(2) // b
-var o = { a: 1, b: 2 }.has(0) // undefined
-;[1].has(1) // 1
-;[].has(1) // undefined
-```
-
-
-
## `Object..at(path)`
diff --git a/objix.js b/objix.js
index d14b3b9..0f77c6c 100644
--- a/objix.js
+++ b/objix.js
@@ -20,10 +20,6 @@ const
return r
},
- has(o,d) {
- return this.find(v => v.eq(o))
- },
-
filter(f, r={}) {
for (let k in this) if (f(this[k],k)) r[k] = this[k]
return r
@@ -42,8 +38,8 @@ const
: this[C] == t || !i && this instanceof t
},
- find(f) {
- for (let k in this) if (f(this[k],k)) return k
+ find(t) {
+ for (let k in this) if (t.call ? t(this[k],k) : this[k].eq(t)) return k
},
extend(...a) {
diff --git a/objix.min.js b/objix.min.js
index cb62429..ef3d66b 100644
--- a/objix.min.js
+++ b/objix.min.js
@@ -1 +1 @@
-const O=Object,C="constructor",K=O.keys,A=O.assign,M={every(t){for(let e in this)if(!t(this[e],e))return!1;return!0},some(t){for(let e in this)if(t(this[e],e))return!0;return!1},map(t,e={}){for(let i in this)e[i]=t(this[i],i);return e},has(t,e){return this.find(e=>e.eq(t))},filter(t,e={}){for(let i in this)t(this[i],i)&&(e[i]=this[i]);return e},flatMap(t){return O.fromEntries(K(this).flatMap(e=>t(e,this[e])))},clean(){return this.filter(t=>t)},is(t,e){return e||t!=O?this[C]==t||!e&&this instanceof t:![Number,String,Boolean,Function,Symbol].includes(this[C])},find(t){for(let e in this)if(t(this[e],e))return e},extend(...t){return A({},...t).map((t,e)=>this[e]??t,this)},delete(...t){for(let e of t)delete this[e];return this},clone(t){return this.is(O)?this[C]==Array?this.map(e=>t&&e?e.clone(t-1):e):this.size()?this.map(e=>t&&e?e.clone(t-1):e,new this[C]):new this[C](this):this.valueOf()},join(...t){let e=A({},this);for(let i of t)K(i).map(t=>e[t]&&=[].concat(e[t],i[t]));return e},split(t=[]){for(let e in this)this[e].map((i,r)=>t[r]?t[r][e]=i:t[r]={[e]:i});return t},same(t){return this.filter((e,i)=>e.eq(t[i]))},diff(t){return this.filter((e,i)=>!e.eq(t[i]))},contains(t,e){return t.every((t,e)=>this[e]?.eq(t))||e&&this.some(i=>i.contains(t,e-1))},eq(t,e){return this==t||t&&this.is(t[C])&&this.size()==t.size()&&!(this-t)&&this.every((i,r)=>i==t[r]||e&&i?.eq(t[r],e-1))},size(){return K(this).length},keyBy(t,e){return t.map(t=>this[t[e]]=this[t[e]]?[t].concat(this[t[e]]):t),this},at(t){return t.split(".").reduce((t,e)=>t[e],this)},$(t){return t?t.is(String)?t.replace(/\${?([\w\.]+)}?/g,(t,e)=>this.at(e).$()):(t.stringify||t)(this):this.$(JSON).replace(/"(\w+)":/g,"$1:")},memo(t){return t?(...e)=>this[e.$()]??=(this.wait(t).then(t=>delete t[e.$()]),this(...e)):this},bind(t,e,i){return def(this,t,(function(...t){return e(...t,this)}).memo(i)),this},log(t="",e,i="log"){return(!e||e(this))&&console[i](Date().slice(4,24),"-",t,this.clone()),this},try(t,e,i,r){try{r=t(this)}catch(s){r=e&&e(s,this)}return i?this:r},new(t){return this._t?new Proxy(this._t.new(t),this._h):A(this.create(),t)},wait(t){return new Promise((e,i)=>t.is(Number)?setTimeout(()=>e(this),1e3*e):(t=t(this,e,i))&&e(t))},trap(t,e,...i){return new Proxy(this,{set(r,s,n){if((!i[0]||i.has(s))&&!t(n,s,r)&&e)throw e+" "+[s,n].$();return r[s]=n},get(t,e){return({_t:t,_h:this})[e]||t[e]}})}};for(let m of["keys","values","entries","create","assign"])M[m]=function(...t){return O[m](this,...t)};let def=(t,e,i)=>(O.defineProperty(t,e,{writable:!0,value:i}),i);for(let m in O.prototype[Symbol.iterator]=function(){return this.values()[Symbol.iterator]()},M){[m,"__"+m].map(t=>def(O.prototype,t,M[m]));try{module.exports[m]=(t,...e)=>t["__"+m](...e)}catch{}}
\ No newline at end of file
+const O=Object,C="constructor",K=O.keys,A=O.assign,M={every(t){for(let e in this)if(!t(this[e],e))return!1;return!0},some(t){for(let e in this)if(t(this[e],e))return!0;return!1},map(t,e={}){for(let i in this)e[i]=t(this[i],i);return e},filter(t,e={}){for(let i in this)t(this[i],i)&&(e[i]=this[i]);return e},flatMap(t){return O.fromEntries(K(this).flatMap(e=>t(e,this[e])))},clean(){return this.filter(t=>t)},is(t,e){return e||t!=O?this[C]==t||!e&&this instanceof t:![Number,String,Boolean,Function,Symbol].includes(this[C])},find(t){for(let e in this)if(t.call?t(this[e],e):this[e].eq(t))return e},extend(...t){return A({},...t).map((t,e)=>this[e]??t,this)},delete(...t){for(let e of t)delete this[e];return this},clone(t){return this.is(O)?this[C]==Array?this.map(e=>t&&e?e.clone(t-1):e):this.size()?this.map(e=>t&&e?e.clone(t-1):e,new this[C]):new this[C](this):this.valueOf()},join(...t){let e=A({},this);for(let i of t)K(i).map(t=>e[t]&&=[].concat(e[t],i[t]));return e},split(t=[]){for(let e in this)this[e].map((i,r)=>t[r]?t[r][e]=i:t[r]={[e]:i});return t},same(t){return this.filter((e,i)=>e.eq(t[i]))},diff(t){return this.filter((e,i)=>!e.eq(t[i]))},contains(t,e){return t.every((t,e)=>this[e]?.eq(t))||e&&this.some(i=>i.contains(t,e-1))},eq(t,e){return this==t||t&&this.is(t[C])&&this.size()==t.size()&&!(this-t)&&this.every((i,r)=>i==t[r]||e&&i?.eq(t[r],e-1))},size(){return K(this).length},keyBy(t,e){return t.map(t=>this[t[e]]=this[t[e]]?[t].concat(this[t[e]]):t),this},at(t){return t.split(".").reduce((t,e)=>t[e],this)},$(t){return t?t.is(String)?t.replace(/\${?([\w\.]+)}?/g,(t,e)=>this.at(e).$()):(t.stringify||t)(this):this.$(JSON).replace(/"(\w+)":/g,"$1:")},memo(t){return t?(...e)=>this[e.$()]??=(this.wait(t).then(t=>delete t[e.$()]),this(...e)):this},bind(t,e,i){return def(this,t,(function(...t){return e(...t,this)}).memo(i)),this},log(t="",e,i="log"){return(!e||e(this))&&console[i](Date().slice(4,24),"-",t,this.clone()),this},try(t,e,i,r){try{r=t(this)}catch(s){r=e&&e(s,this)}return i?this:r},new(t){return this._t?new Proxy(this._t.new(t),this._h):A(this.create(),t)},wait(t){return new Promise((e,i)=>t.is(Number)?setTimeout(()=>e(this),1e3*e):(t=t(this,e,i))&&e(t))},trap(t,e,...i){return new Proxy(this,{set(r,s,h){if((!i[0]||i.has(s))&&!t(h,s,r)&&e)throw e+" "+[s,h].$();return r[s]=h},get(t,e){return({_t:t,_h:this})[e]||t[e]}})}};for(let m of["keys","values","entries","create","assign"])M[m]=function(...t){return O[m](this,...t)};let def=(t,e,i)=>(O.defineProperty(t,e,{writable:!0,value:i}),i);for(let m in O.prototype[Symbol.iterator]=function(){return this.values()[Symbol.iterator]()},M){[m,"__"+m].map(t=>def(O.prototype,t,M[m]));try{module.exports[m]=(t,...e)=>t["__"+m](...e)}catch{}}
\ No newline at end of file
diff --git a/package.json b/package.json
index 397d44d..eeb5aec 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "objix",
- "version": "1.11.9",
+ "version": "1.12.0",
"description": "A dangerously convienient, high performance and super lightweight utility (2.7kb) that injects methods into the Object prototype to sugar for many common use cases working with Javascript objects.",
"main": "objix.js",
"scripts": {