src/Pure/General/same.ML
author nipkow
Tue, 17 Jun 2025 14:11:40 +0200
changeset 82733 8b537e1af2ec
parent 80602 7aa14d4567fe
permissions -rw-r--r--
reinstated intersection of lists as inter_list_set
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/same.ML
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     3
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     4
Support for copy-avoiding functions on pure values, at the cost of
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     5
readability.
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     6
*)
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     7
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     8
signature SAME =
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
     9
sig
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    10
  exception SAME
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    11
  type ('a, 'b) function = 'a -> 'b  (*exception SAME*)
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    12
  type 'a operation = ('a, 'a) function  (*exception SAME*)
32025
e8fbfa84c23f added same;
wenzelm
parents: 32022
diff changeset
    13
  val same: ('a, 'b) function
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    14
  val commit: 'a operation -> 'a -> 'a
80602
7aa14d4567fe more operations;
wenzelm
parents: 79400
diff changeset
    15
  val commit_if: bool -> 'a operation -> 'a -> 'a
79129
2933e71f4e09 clarified signature;
wenzelm
parents: 78712
diff changeset
    16
  val commit_id: 'a operation -> 'a -> 'a * bool
79131
cd17a90523d4 more operations;
wenzelm
parents: 79129
diff changeset
    17
  val catch: ('a, 'b) function -> 'a -> 'b option
79272
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79131
diff changeset
    18
  val compose: 'a operation -> 'a operation -> 'a operation
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    19
  val function: ('a -> 'b option) -> ('a, 'b) function
79400
0824ca1f1da0 clarified modules;
wenzelm
parents: 79272
diff changeset
    20
  val function_eq: ('a * 'b -> bool) -> ('a -> 'b) -> ('a, 'b) function
32017
e91a3acf8383 added map;
wenzelm
parents: 32015
diff changeset
    21
  val map: 'a operation -> 'a list operation
32022
c2f4ee07647f added map_option;
wenzelm
parents: 32017
diff changeset
    22
  val map_option: ('a, 'b) function -> ('a option, 'b option) function
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    23
end;
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    24
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    25
structure Same: SAME =
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    26
struct
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    27
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    28
exception SAME;
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    29
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    30
type ('a, 'b) function = 'a -> 'b;
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    31
type 'a operation = ('a, 'a) function;
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    32
32025
e8fbfa84c23f added same;
wenzelm
parents: 32022
diff changeset
    33
fun same _ = raise SAME;
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    34
fun commit f x = f x handle SAME => x;
80602
7aa14d4567fe more operations;
wenzelm
parents: 79400
diff changeset
    35
fun commit_if b f x = if b then commit f x else f x;
79129
2933e71f4e09 clarified signature;
wenzelm
parents: 78712
diff changeset
    36
fun commit_id f x = (f x, false) handle SAME => (x, true);
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    37
79131
cd17a90523d4 more operations;
wenzelm
parents: 79129
diff changeset
    38
fun catch f x = SOME (f x) handle SAME => NONE;
cd17a90523d4 more operations;
wenzelm
parents: 79129
diff changeset
    39
79272
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79131
diff changeset
    40
fun compose g f x =
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79131
diff changeset
    41
  (case catch f x of
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79131
diff changeset
    42
    NONE => g x
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79131
diff changeset
    43
  | SOME y => commit g y);
899f37f6d218 proper beta_norm after instantiation (amending 90c5aadcc4b2);
wenzelm
parents: 79131
diff changeset
    44
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    45
fun function f x =
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    46
  (case f x of
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    47
    NONE => raise SAME
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    48
  | SOME y => y);
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    49
79400
0824ca1f1da0 clarified modules;
wenzelm
parents: 79272
diff changeset
    50
fun function_eq eq f x =
0824ca1f1da0 clarified modules;
wenzelm
parents: 79272
diff changeset
    51
  let val y = f x
0824ca1f1da0 clarified modules;
wenzelm
parents: 79272
diff changeset
    52
  in if eq (x, y) then raise SAME else y end;
0824ca1f1da0 clarified modules;
wenzelm
parents: 79272
diff changeset
    53
32017
e91a3acf8383 added map;
wenzelm
parents: 32015
diff changeset
    54
fun map f [] = raise SAME
e91a3acf8383 added map;
wenzelm
parents: 32015
diff changeset
    55
  | map f (x :: xs) = (f x :: commit (map f) xs handle SAME => x :: map f xs);
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    56
32022
c2f4ee07647f added map_option;
wenzelm
parents: 32017
diff changeset
    57
fun map_option f NONE = raise SAME
c2f4ee07647f added map_option;
wenzelm
parents: 32017
diff changeset
    58
  | map_option f (SOME x) = SOME (f x);
c2f4ee07647f added map_option;
wenzelm
parents: 32017
diff changeset
    59
32015
7101feb5247e Support for copy-avoiding functions on pure values, at the cost of readability.
wenzelm
parents:
diff changeset
    60
end;