| author | wenzelm | 
| Sat, 09 Nov 2024 16:34:14 +0100 | |
| changeset 81412 | 4794576828df | 
| parent 80602 | 7aa14d4567fe | 
| permissions | -rw-r--r-- | 
| 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 | 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 | 15 | val commit_if: bool -> 'a operation -> 'a -> 'a | 
| 79129 | 16 | val commit_id: 'a operation -> 'a -> 'a * bool | 
| 79131 | 17 |   val catch: ('a, 'b) function -> 'a -> 'b option
 | 
| 79272 
899f37f6d218
proper beta_norm after instantiation (amending 90c5aadcc4b2);
 wenzelm parents: 
79131diff
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 | 20 |   val function_eq: ('a * 'b -> bool) -> ('a -> 'b) -> ('a, 'b) function
 | 
| 32017 | 21 | val map: 'a operation -> 'a list operation | 
| 32022 | 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 | 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 | 35 | fun commit_if b f x = if b then commit f x else f x; | 
| 79129 | 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 | 38 | fun catch f x = SOME (f x) handle SAME => NONE; | 
| 39 | ||
| 79272 
899f37f6d218
proper beta_norm after instantiation (amending 90c5aadcc4b2);
 wenzelm parents: 
79131diff
changeset | 40 | fun compose g f x = | 
| 
899f37f6d218
proper beta_norm after instantiation (amending 90c5aadcc4b2);
 wenzelm parents: 
79131diff
changeset | 41 | (case catch f x of | 
| 
899f37f6d218
proper beta_norm after instantiation (amending 90c5aadcc4b2);
 wenzelm parents: 
79131diff
changeset | 42 | NONE => g x | 
| 
899f37f6d218
proper beta_norm after instantiation (amending 90c5aadcc4b2);
 wenzelm parents: 
79131diff
changeset | 43 | | SOME y => commit g y); | 
| 
899f37f6d218
proper beta_norm after instantiation (amending 90c5aadcc4b2);
 wenzelm parents: 
79131diff
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 | 50 | fun function_eq eq f x = | 
| 51 | let val y = f x | |
| 52 | in if eq (x, y) then raise SAME else y end; | |
| 53 | ||
| 32017 | 54 | fun map f [] = raise SAME | 
| 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 | 57 | fun map_option f NONE = raise SAME | 
| 58 | | map_option f (SOME x) = SOME (f x); | |
| 59 | ||
| 32015 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 60 | end; |