equal
deleted
inserted
replaced
348 | split_arg_mode' m t = |
348 | split_arg_mode' m t = |
349 if eq_mode (m, Input) then (SOME t, NONE) |
349 if eq_mode (m, Input) then (SOME t, NONE) |
350 else if eq_mode (m, Output) then (NONE, SOME t) |
350 else if eq_mode (m, Output) then (NONE, SOME t) |
351 else raise Fail "split_map_mode: mode and term do not match" |
351 else raise Fail "split_map_mode: mode and term do not match" |
352 in |
352 in |
353 (pairself (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) ts) |
353 (apply2 (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) ts) |
354 end |
354 end |
355 |
355 |
356 (* splits mode and maps function to higher-order argument types *) |
356 (* splits mode and maps function to higher-order argument types *) |
357 fun split_map_modeT f mode Ts = |
357 fun split_map_modeT f mode Ts = |
358 let |
358 let |
366 end |
366 end |
367 | split_arg_mode' Input T = (SOME T, NONE) |
367 | split_arg_mode' Input T = (SOME T, NONE) |
368 | split_arg_mode' Output T = (NONE, SOME T) |
368 | split_arg_mode' Output T = (NONE, SOME T) |
369 | split_arg_mode' _ _ = raise Fail "split_modeT': mode and type do not match" |
369 | split_arg_mode' _ _ = raise Fail "split_modeT': mode and type do not match" |
370 in |
370 in |
371 (pairself (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) Ts) |
371 (apply2 (map_filter I) o split_list) (map2 split_arg_mode' (strip_fun_mode mode) Ts) |
372 end |
372 end |
373 |
373 |
374 fun split_mode mode ts = split_map_mode (fn _ => fn _ => (NONE, NONE)) mode ts |
374 fun split_mode mode ts = split_map_mode (fn _ => fn _ => (NONE, NONE)) mode ts |
375 |
375 |
376 fun fold_map_aterms_prodT comb f (Type (@{type_name Product_Type.prod}, [T1, T2])) s = |
376 fun fold_map_aterms_prodT comb f (Type (@{type_name Product_Type.prod}, [T1, T2])) s = |
398 end |
398 end |
399 | split_arg_mode Input T = ([T], []) |
399 | split_arg_mode Input T = ([T], []) |
400 | split_arg_mode Output T = ([], [T]) |
400 | split_arg_mode Output T = ([], [T]) |
401 | split_arg_mode _ _ = raise Fail "split_modeT: mode and type do not match" |
401 | split_arg_mode _ _ = raise Fail "split_modeT: mode and type do not match" |
402 in |
402 in |
403 (pairself flat o split_list) (map2 split_arg_mode (strip_fun_mode mode) Ts) |
403 (apply2 flat o split_list) (map2 split_arg_mode (strip_fun_mode mode) Ts) |
404 end |
404 end |
405 |
405 |
406 fun string_of_mode mode = |
406 fun string_of_mode mode = |
407 let |
407 let |
408 fun string_of_mode1 Input = "i" |
408 fun string_of_mode1 Input = "i" |