dict.js (5280B)
1 import { OrderedMap } from "immutable"; 2 import { REArgumentError } from "../errors/messages.js"; 3 import { makeDefinition } from "../library/registry/fnDefinition.js"; 4 import { frAny, frArray, frDictWithArbitraryKeys, frLambda, frString, frTuple, } from "../library/registry/frTypes.js"; 5 import { FnFactory } from "../library/registry/helpers.js"; 6 import { ImmutableMap } from "../utility/immutableMap.js"; 7 import { vArray, vDict, vString } from "../value/index.js"; 8 const maker = new FnFactory({ 9 nameSpace: "Dict", 10 requiresNamespace: true, 11 }); 12 export const library = [ 13 maker.make({ 14 name: "set", 15 output: "Dict", 16 examples: [`Dict.set({a: 1, b: 2}, "c", 3)`], 17 definitions: [ 18 makeDefinition([frDictWithArbitraryKeys(frAny), frString, frAny], ([dict, key, value]) => vDict(dict.set(key, value))), 19 ], 20 }), 21 maker.make({ 22 name: "merge", 23 output: "Dict", 24 examples: [`Dict.merge({a: 1, b: 2}, {c: 3, d: 4})`], 25 definitions: [ 26 makeDefinition([frDictWithArbitraryKeys(frAny), frDictWithArbitraryKeys(frAny)], ([d1, d2]) => vDict(ImmutableMap([...d1.entries(), ...d2.entries()]))), 27 ], 28 }), 29 maker.make({ 30 name: "mergeMany", 31 output: "Dict", 32 examples: [`Dict.mergeMany([{a: 1, b: 2}, {c: 3, d: 4}])`], 33 definitions: [ 34 makeDefinition([frArray(frDictWithArbitraryKeys(frAny))], ([dicts]) => vDict(ImmutableMap(dicts.map((d) => [...d.entries()]).flat()))), 35 ], 36 }), 37 maker.make({ 38 name: "keys", 39 output: "Array", 40 examples: [`Dict.keys({a: 1, b: 2})`], 41 definitions: [ 42 makeDefinition([frDictWithArbitraryKeys(frAny)], ([d1]) => vArray([...d1.keys()].map((k) => vString(k)))), 43 ], 44 }), 45 maker.make({ 46 name: "values", 47 output: "Array", 48 examples: [`Dict.values({a: 1, b: 2})`], 49 definitions: [ 50 makeDefinition([frDictWithArbitraryKeys(frAny)], ([d1]) => vArray([...d1.values()])), 51 ], 52 }), 53 maker.make({ 54 name: "toList", 55 output: "Array", 56 examples: [`Dict.toList({a: 1, b: 2})`], 57 definitions: [ 58 makeDefinition([frDictWithArbitraryKeys(frAny)], ([dict]) => vArray([...dict.entries()].map(([k, v]) => vArray([vString(k), v])))), 59 ], 60 }), 61 maker.make({ 62 name: "fromList", 63 output: "Dict", 64 examples: [`Dict.fromList([["a", 1], ["b", 2]])`], 65 definitions: [ 66 makeDefinition([frArray(frTuple(frString, frAny))], ([items]) => vDict(ImmutableMap(items))), 67 ], 68 }), 69 maker.make({ 70 name: "map", 71 output: "Dict", 72 examples: [`Dict.map({a: 1, b: 2}, {|x| x + 1})`], 73 definitions: [ 74 makeDefinition([frDictWithArbitraryKeys(frAny), frLambda], ([dict, lambda], context) => { 75 return vDict(ImmutableMap([...dict.entries()].map(([key, value]) => { 76 const mappedValue = lambda.call([value], context); 77 return [key, mappedValue]; 78 }))); 79 }), 80 ], 81 }), 82 maker.make({ 83 name: "mapKeys", 84 output: "Dict", 85 examples: [`Dict.mapKeys({a: 1, b: 2}, {|x| concat(x, "-1")})`], 86 definitions: [ 87 makeDefinition([frDictWithArbitraryKeys(frAny), frLambda], ([dict, lambda], context) => { 88 const mappedEntries = []; 89 for (const [key, value] of dict.entries()) { 90 const mappedKey = lambda.call([vString(key)], context); 91 if (mappedKey.type == "String") { 92 mappedEntries.push([mappedKey.value, value]); 93 } 94 else { 95 throw new REArgumentError("mapKeys: lambda must return a string"); 96 } 97 } 98 return vDict(ImmutableMap(mappedEntries)); 99 }), 100 ], 101 }), 102 maker.make({ 103 name: "pick", 104 output: "Dict", 105 examples: [`Dict.pick({a: 1, b: 2, c: 3}, ['a', 'c'])`], 106 definitions: [ 107 makeDefinition([frDictWithArbitraryKeys(frAny), frArray(frString)], ([dict, keys]) => { 108 const response = OrderedMap().withMutations((result) => { 109 keys.forEach((key) => { 110 const value = dict.get(key); 111 if (dict.has(key) && value) { 112 result.set(key, value); 113 } 114 }); 115 }); 116 return vDict(response); 117 }), 118 ], 119 }), 120 maker.make({ 121 name: "omit", 122 output: "Dict", 123 examples: [`Dict.omit({a: 1, b: 2, c: 3}, ['b'])`], 124 definitions: [ 125 makeDefinition([frDictWithArbitraryKeys(frAny), frArray(frString)], ([dict, keys]) => { 126 const response = dict.withMutations((result) => { 127 keys.forEach((key) => { 128 if (result.has(key)) { 129 result.delete(key); 130 } 131 }); 132 }); 133 return vDict(response); 134 }), 135 ], 136 }), 137 ]; 138 //# sourceMappingURL=dict.js.map