рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЖрдЗрдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░рдЪрдирд╛ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд░рдЪрдирд╛ / рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрд░реНрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВред


рдЯреАрдПрд▓, рдбреЙ
рдПрдХ рдмреЙрд╕ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗрдВ:
рдЫрд╡рд┐
compose рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирдП рдФрд░ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред


рдЖрдк рдХрдВрдкреЛрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╢реБрджреНрдз рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рддрд░реНрдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╣реА рдХреНрд░рдо рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдХреЙрд▓ - рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреЗ рд╕рдВрд╕реНрдорд░рдг, рддреБрд▓рдирд╛ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рднреАред
рдХреБрдЫ рддреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдкреНрд░реЗрд░рдгрд╛


  • рд╕рд╣рдпреЛрдЧреА рдкрд╣рдЪрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рди рдХрд░реЗрдВ рдФрд░ рд░рдЪрдирд╛ рдХреЗ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд░рд┐рдПрдХреНрдЯ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЙрдерд▓реЗ рдХрд╛рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рднреЗрдЬрдиреЗ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдЧреА, рдЬрд┐рд╕рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдп рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рдХрд┐рд╕реА рд░рдЪрдирд╛ рдХреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ, рдЧреАрдд рдкрд╣рдЪрд╛рди рдХреЗ рдореБрджреНрджреЗ рдХреЛ рддрд░реНрдХреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рд╣рдЪрд░реНрдп рдкрд╣рдЪрд╛рди рдХрд╛ рд╕рд╡рд╛рд▓ рдмрдирд╛ рд╣реБрдЖ рд╣реИ:


 import {memoize} from 'ramda' const memoCompose = memoize(compose) memoCompose(a, b) === memoCompose(a, b) // ,   memoCompose(memoCompose(a, b), c) === memoCompose(a, memoCompose(b, c)) // ,        

  • рд░рдЪрдирд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ:

рдмреЗрд╢рдХ, рдЯреИрдк рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЙрди рдбреАрдмрдЧрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рдирдХреА рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдлреНрд▓реИрдЯ рдХреЙрд▓ рд╕реНрдЯреИрдХ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред


  • рдУрд╡рд░рд╣реЗрдб рд╕рдВрдмрдВрдзрд┐рдд рдУрд╡рд░рд╣реЗрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ:

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░рдЪрдирд╛ рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЙрдкрд░рд┐ рд╣реИ, рдЬреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдореЗрдВ рдирдП рддрддреНрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдк 5 рдпрд╛ рдЕрдзрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдФрд░ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рджрд░реНрдЬрдиреЛрдВ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд░рдЪрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред


рдирд┐рд░реНрдгрдп


рдлрдВрддрд╛рд╕реА-рднреВрдорд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдореЛрдиреЙрдпрдб (рдпрд╛ рд╢реНрд░реЗрдгреА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдореАрдЧреНрд░реБрдкреЙрдЗрдб) рдмрдирд╛рдПрдВ:


 import compose, {identity} from 'lazy-compose' import {add} from 'ramda' const a = add(1) const b = add(2) const c = add(3) test('Laws', () => { compose(a, compose(b, c)) === compose(compose(a, b), c) //  compose(a, identity) === a //right identity compose(identity, a) === a //left identity } 

рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


  • рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рдордЧреНрд░ рд░рдЪрдирд╛рдУрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП redux / mapStateToProps рдФрд░
    рдлрд┐рд░ рд╕реЗ рдЪреБрдиреЗрдВред
  • рд▓реЗрдВрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ред

рдЖрдк рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдП рдЧрдП рдХрдбрд╝рд╛рдИ рд╕реЗ рд╕рдордХрдХреНрд╖ рд▓реЗрдВрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


  import {lensProp, memoize} from 'ramda' import compose from 'lazy-compose' const constantLens = memoize(lensProp) const lensA = constantLens('a') const lensB = constantLens('b') const lensC = constantLens('c') const lensAB = compose(lensB, lensA) console.log( compose(lensC, lensAB) === compose(lensC, lensB, lensA) ) 

  • рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рдореЗрдореЛрд▓рд╛рдЗрдЬреНрдб рдХреЙрд▓рдмреИрдХред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рд╣реА рдХреЙрд▓рдмреИрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред


 ```jsx import {compose, constant} from './src/lazyCompose' // constant - returns the same memoized function for each argrum // just like React.useCallback import {compose, constant} from 'lazy-compose' const List = ({dispatch, data}) => data.map( id => <Button key={id} onClick={compose(dispatch, makeAction, contsant(id))} /> ) const Button = React.memo( props => <button {...props} /> ) const makeAction = payload => ({ type: 'onClick', payload, }) ``` 

  • рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреА рдЖрд▓рд╕реА рд╕рдВрд░рдЪрдирд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд▓рд╕реА рд░рдЪрдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрдВрдж рдмрдирд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░ рджреЗрдЧреАред рдпрд╣ рдкреНрд░рд╢реНрди рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИред


     import {memoize, mergeRight} from 'ramda' import {constant, compose} from './src/lazyCompose' const defaultProps = memoize(mergeRight) const withState = memoize( defaultState => props => { const [state, setState] = React.useState(defaultState) return {...props, state, setState} } ) const Component = ({value, label, ...props)) => <label {...props}>{label} : {value}</label> const withCounter = compose( ({setState, state, ...props}) => ({ ...props value: state, onClick: compose(setState, constant(state + 1)) }), withState(0), ) const Counter = compose( Component, withCounter, defaultProps({label: 'Clicks'}), ) 

  • рд░рдЪрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдЦреНрдд рддреБрд▓реНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдореЛрдирд╛рдбреНрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рдВрд╕ (рдлрдВрддрд╛рд╕реА-рднреВрдорд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ)ред рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:



  type Info = { age?: number } type User = { info?: Info } const mayBeAge = LazyMaybe<Info>.of(identity) .map(getAge) .contramap(getInfo) const age = mayBeAge.ap(data) const maybeAge2 = LazyMaybe<User>.of(compose(getAge, getInfo)) console.log(maybeAge === maybeAge2) //   ,      //           

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ , рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИ ред
рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ: npm i lazy-compose ред


рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреИрд╢ рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред


рдпреБрдкреАрдбреА
рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд╕рд╡рд╛рд▓реЛрдВ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ:
рд╣рд╛рдВ, рдЖрдк рдореИрдк рдХреЛ рд╡реАрдХреИрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рдВ, рдЖрдкрдХреЛ рддреГрддреАрдп-рдкрдХреНрд╖ рдХреИрд╢ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдЖрдкрдХреЛ рдХреИрд╢ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣рд╕ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреЛрдИ рдЖрджрд░реНрд╢ рдХреИрд╢рд┐рдВрдЧ рд░рдгрдиреАрддрд┐ рдирд╣реАрдВ рд╣реИред
рдкреВрдВрдЫ рдФрд░ рд╕рд┐рд░ рдХреНрдпреЛрдВ, рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рд╕реВрдЪреА рдореЗрдВ рд╣реИ - рдкреВрдВрдЫ рдФрд░ рд╕рд┐рд░, рд░рдЪрдирд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреНрдЮрд╛рдкрди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВред

Source: https://habr.com/ru/post/hi432196/


All Articles