struct   type t = {     name: string;     parameters: (string * string) list   }   let name t = t.name   let to_json {name; parameters}: Yojson.Basic.json =     `Assoc [       "name"`String name;       "parameters",       `Assoc (List.map parameters ~f:(fun (a, b) -> a, `String b));     ]   let generate_config_file ~path config : KEDSL.Program.t =     let open KEDSL in     Program.(       shf "echo '[user]' > %s" path       && chain         (List.map config.parameters (fun (k, v) ->              shf "echo '%s = %s' >> %s" k v path))     )   let default =     { name = "default";       parameters = [         "isSkipDepthFilters""0";         "maxInputDepth""10000";         "depthFilterMultiple""3.0";         "snvMaxFilteredBasecallFrac""0.4";         "snvMaxSpanningDeletionFrac""0.75";         "indelMaxRefRepeat""8";         "indelMaxWindowFilteredBasecallFrac""0.3";         "indelMaxIntHpolLength""14";         "ssnvPrior""0.000001";         "sindelPrior""0.000001";         "ssnvNoise""0.0000005";         "sindelNoise""0.0000001";         "ssnvNoiseStrandBiasFrac""0.5";         "minTier1Mapq""40";         "minTier2Mapq""5";         "ssnvQuality_LowerBound""15";         "sindelQuality_LowerBound""30";         "isWriteRealignedBam""0";         "binSize""25000000";         "extraStrelkaArguments""--eland-compatibility";       ]}   let test1 =     { name = "test1";       parameters = [         "isSkipDepthFilters""0";         "maxInputDepth""10000";         "depthFilterMultiple""3.0";         "snvMaxFilteredBasecallFrac""0.4";         "snvMaxSpanningDeletionFrac""0.75";         "indelMaxRefRepeat""8";         "indelMaxWindowFilteredBasecallFrac""0.3";         "indelMaxIntHpolLength""14";         "ssnvPrior""0.000001";         "sindelPrior""0.000001";         "ssnvNoise""0.0000005";         "sindelNoise""0.0000001";         "ssnvNoiseStrandBiasFrac""0.5";         "minTier1Mapq""40";         "minTier2Mapq""5";         "ssnvQuality_LowerBound""15";         "sindelQuality_LowerBound""30";         "isWriteRealignedBam""0";         "binSize""25000000";         "extraStrelkaArguments""--eland-compatibility";         "priorSomaticSnvRate""1e-06";         "germlineSnvTheta""0.001";       ]}   let empty_exome =     { name = "empty-exome";       parameters = [         "isSkipDepthFilters""1";       ]}   let exome_default =     { name = "exome-default";       parameters = [         "isSkipDepthFilters""1";         "maxInputDepth""10000";         "depthFilterMultiple""3.0";         "snvMaxFilteredBasecallFrac""0.4";         "snvMaxSpanningDeletionFrac""0.75";         "indelMaxRefRepeat""8";         "indelMaxWindowFilteredBasecallFrac""0.3";         "indelMaxIntHpolLength""14";         "ssnvPrior""0.000001";         "sindelPrior""0.000001";         "ssnvNoise""0.0000005";         "sindelNoise""0.0000001";         "ssnvNoiseStrandBiasFrac""0.5";         "minTier1Mapq""40";         "minTier2Mapq""5";         "ssnvQuality_LowerBound""15";         "sindelQuality_LowerBound""30";         "isWriteRealignedBam""0";         "binSize""25000000";         "extraStrelkaArguments""--eland-compatibility";       ]} end