mAssignDefaults

mAssignDefaults

  • (defaults: object) => (base: object) => base
    Or
  • (defaults: map) => (base: map) => base
  1. Assign a KeyedCollection over defaults.

    Consider assignDefaults instead.
    This is for the uncommon case where mutating base is required.

    const ab = { a: 1, b: 2 }
    const assignDefaultsAB = mAssignDefaults(ab)
    const obj = { a: 2, c: 3 }
    const mutatedObj = assignDefaultsAB(obj)
    
    console.log(mutatedObj === obj) // is true
    console.log(obj) // is { a: 2, c: 3, b: 2 }
    type ABC = {
      a: number
      b: number
      c: number
    }
    
    const ab = { a: 1, b: 2 }
    const assignDefaultsAB = mAssignDefaults(ab)
    const obj = { a: 2, c: 3 } as ABC
    const mutatedObj = assignDefaultsAB(obj)
    
    console.log(mutatedObj === obj) // is true
    console.log(obj) // is { a: 2, c: 3, b: 2 }
    
    const ab = { a: 1, b: 2 }
    const assignDefaultsAB = mAssignDefaults(ab)
    const obj = { a: 2, c: 3 }
    const mutatedObj = assignDefaultsAB(obj)
    
    console.log(mutatedObj === obj) // is true
    console.log(obj) // is { a: 2, c: 3, b: 2 }
    type ABC = {
      a: number
      b: number
      c: number
    }
    
    const ab = { a: 1, b: 2 }
    const assignDefaultsAB = mAssignDefaults(ab)
    const obj = { a: 2, c: 3 } as ABC
    const mutatedObj = assignDefaultsAB(obj)
    
    console.log(mutatedObj === obj) // is true
    console.log(obj) // is { a: 2, c: 3, b: 2 }
    
  2. Sometimes we want to mutate a collection by assigning defaults. Below, we have a list of wedding dinner orders. By default they're served chicken and rice, but they can choose tofu or a salad. Let's get the final orders for the wedding.

    const defaultDinner = {
      side: 'rice',
      main: 'chicken',
    }
    
    const orders = {
      emma: {
        side: 'salad',
        main: 'tofu',
      },
      meg: {
        side: 'salad',
      },
      tom: {},
    }
    
    const assignDefaultDinner = mAssignDefaults(defaultDinner)
    const assignDinners = forEach(assignDefaultDinner)
    assignDinners(orders)
    console.log(orders)
    // is {
    //   emma: {
    //     side: salad
    //     main: tofu
    //   }
    //   meg: {
    //     side: salad
    //     main: chicken
    //   }
    //   tom: {
    //     side: rice
    //     main: chicken
    //   }
    // }
    type Dinner = {
      side: 'rice' | 'salad'
      main: 'chicken' | 'tofu'
    }
    
    const defaultDinner: Dinner = {
      side: 'rice',
      main: 'chicken',
    }
    
    type Orders = Record<string, Dinner>
    const orders: Orders = {
      emma: {
        side: 'salad',
        main: 'tofu',
      },
      meg: {
        side: 'salad',
      } as Dinner,
      tom: {} as Dinner,
    }
    
    const assignDefaultDinner = mAssignDefaults(defaultDinner)
    const assignDinners = forEach(assignDefaultDinner)<Orders>
    assignDinners(orders)
    console.log(orders)
    // is {
    //   emma: {
    //     side: salad
    //     main: tofu
    //   }
    //   meg: {
    //     side: salad
    //     main: chicken
    //   }
    //   tom: {
    //     side: rice
    //     main: chicken
    //   }
    // }
    
    const defaultDinner = {
      side: 'rice',
      main: 'chicken',
    }
    
    const orders = {
      emma: {
        side: 'salad',
        main: 'tofu',
      },
      meg: {
        side: 'salad',
      },
      tom: {},
    }
    
    const assignDefaultDinner = mAssignDefaults(
      defaultDinner
    )
    const assignDinners = forEach(assignDefaultDinner)
    assignDinners(orders)
    console.log(orders)
    // is {
    //   emma: {
    //     side: salad
    //     main: tofu
    //   }
    //   meg: {
    //     side: salad
    //     main: chicken
    //   }
    //   tom: {
    //     side: rice
    //     main: chicken
    //   }
    // }
    type Dinner = {
      side: 'rice' | 'salad'
      main: 'chicken' | 'tofu'
    }
    
    const defaultDinner: Dinner = {
      side: 'rice',
      main: 'chicken',
    }
    
    type Orders = Record<string, Dinner>
    const orders: Orders = {
      emma: {
        side: 'salad',
        main: 'tofu',
      },
      meg: {
        side: 'salad',
      } as Dinner,
      tom: {} as Dinner,
    }
    
    const assignDefaultDinner = mAssignDefaults(
      defaultDinner
    )
    const assignDinners = forEach(
      assignDefaultDinner
    )<Orders>
    assignDinners(orders)
    console.log(orders)
    // is {
    //   emma: {
    //     side: salad
    //     main: tofu
    //   }
    //   meg: {
    //     side: salad
    //     main: chicken
    //   }
    //   tom: {
    //     side: rice
    //     main: chicken
    //   }
    // }