# Composing Lenses

// [jwarden 3.10.2019] TODO: need a larger example at the bottom.

Both Lodash and Ramda have ways of digging deeper into Objects. For Lodash in a get, you just keep adding dots or Array accessors. Ramda uses path with each item in the Array being 1 level deeper into the Object.

# Lodash Deep Get

For example, if we want to see the 2nd characters 2nd inventory item name in Lodash:

import get from 'lodash/fp/get'

const name = get('characters[1].inventory[1].name', gameObject)
console.log(name) // White Cape

# Ramda Deep Path and Lens

And in Ramda using path:

import { path } from 'ramda'

const name = path(['characters', 1, 'inventory', 1, 'name'], gameObject)
console.log(name) // White Cape

And Ramda's lensPath:

import { view, lensPath } from 'ramda'

const name = view(
    lensPath(['characters', 1, 'inventory', 1, 'name']), 
    gameObject
)
console.log(name) // White Cape

# Focused Compose and Proxy Compose

In Focused, instead of parsing a String like Lodash does or looping through an Array like Ramda does, Focused makes you explicitly compose them. Think of prop like Lodash' get or Ramda's prop and index like Lodash' nth or Ramda's prop:

import { view, compose, prop, index } from 'focused'

const lens = compose(
    prop('characters'),
    index(1),
    prop('inventory'),
    index(1),
    prop('name')
)
const name = view(lens, gameObject)
console.log(name) // White Cape

That is super verbose to write, hence the proxy syntax Focused offers; it automatically calls compose for you.

import { lensProxy, view } from 'focused'

const _ = lensProxy()
const name = view(_.characters[1].inventory[1].name, gameObject)
console.log(name) // White Cape