title: Ramda lenses based on a some value in object
body: <p>Community, hello . I stuck with a small issue.
  I have such a data structure</p>
  
  <pre><code>{
      "type": "Shoes",
      "gender": "female",
      "userInfo": {
          "whois": {
              "male": {
                  "htt": 20.2,
                  "referenceBrands": [{
                      "category": "Shoes",
                      "size": 40
                  }]
              },
              "female": {
                  "height": 191.0,
                  "age": 20,
                  "referenceBrands": [{
                      "category": "Shoes",
                      "size": 35.5
                  }, {
                    "category": "Apparel",
                    "size": 50
                  }]
              }
          },
      }
  }
  </code></pre>
  
  <p>I want to update a specific key in a reference brand based on <code>gender</code> and a <code>type</code> which are in a root.
  Based on this <a href="https://stackoverflow.com/questions/54805737/how-to-perform-a-nested-update-using-ramda-in-the-given-object-structure">answer</a> (thanks to <em>Scott Sauyet</em>), I've created something like this. But as you see, I have hardcoded <code>gender</code> and <code>category</code> what the best way of using composition and point-free style to change this?</p>
  
  <pre><code>const lensMatch = (propName) =&gt; (key) =&gt; lens( 
     find(
        propEq(propName, key)
     ), 
     (val, arr, idx = findIndex(propEq (propName, key), arr)) =&gt;
           update(idx &gt; -1 ? idx : length (arr), val, arr)
     )
  
  const lensCategory = lensMatch('category')
  const genderLens = lensProp('gender')
  const lensReferenceBrand = lensProp('referenceBrands')
  
  const updateSize = (prop, value) =&gt; over(
    compose(
      lensPath(['userInfo', 'whois']),
      lensProp('female'),
      lensReferenceBrand,
      lensCategory('Shoes'),
      lensProp(prop),
    ), always(value), data)
  
  updateSize('size', 100)
  </code></pre>
  
  <p><a href="https://ramdajs.com/repl/?v=0.26.1#?const%20data%20%3D%20%7B%0A%20%20%20%20%22type%22%3A%20%22Shoes%22%2C%0A%20%20%20%20%22gender%22%3A%20%22female%22%2C%0A%20%20%20%20%22userInfo%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22whois%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22male%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22htt%22%3A%2020.2%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22referenceBrands%22%3A%20%5B%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20%22Shoes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22size%22%3A%2040%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22female%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22height%22%3A%20191.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22age%22%3A%2020%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22referenceBrands%22%3A%20%5B%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20%22Shoes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22size%22%3A%2035.5%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22category%22%3A%20%22Footwear%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22size%22%3A%2035.5%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%7D%0A%7D%0Aconst%20lensMatch%20%3D%20%28propName%29%20%3D%3E%20%28key%29%20%3D%3E%20lens%0A%20%20%28%20find%20%28%20propEq%20%28propName%2C%20key%29%20%29%0A%20%20%20%20%2C%20%28val%2C%20arr%2C%20idx%20%3D%20findIndex%20%28propEq%20%28propName%2C%20key%29%2C%20arr%29%29%20%3D%3E%0A%20%20%20%20%20%20%20%20%20update%20%28idx%20%3E%20-1%20%3F%20idx%20%3A%20length%20%28arr%29%2C%20val%2C%20arr%29%0A%20%20%20%20%29%0A%0Aconst%20lensCategory%20%3D%20lensMatch%28%27category%27%29%0Aconst%20genderLens%20%3D%20lensProp%28%27gender%27%29%0Aconst%20lensReferenceBrand%20%3D%20lensProp%28%27referenceBrands%27%29%0A%0Aconst%20updateSize%20%3D%20%28prop%2C%20value%29%20%3D%3E%20over%28%0A%20%20compose%28%0A%20%20%20%20lensPath%28%5B%27userInfo%27%2C%20%27whois%27%5D%29%2C%0A%20%20%20%20lensProp%28%27female%27%29%2C%0A%20%20%20%20lensReferenceBrand%2C%0A%20%20%20%20lensCategory%28%27Shoes%27%29%2C%0A%20%20%20%20lensProp%28prop%29%2C%0A%20%20%29%2C%20always%28value%29%2C%20data%29%0A%0AupdateSize%28%27size%27%2C%20100%29%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A" rel="nofollow noreferrer">Playground</a></p>