| author | Fabian Huch <huch@in.tum.de> | 
| Fri, 01 Dec 2023 20:32:34 +0100 | |
| changeset 79101 | 4e47b34fbb8e | 
| parent 78712 | c2c4d51b048b | 
| child 79129 | 2933e71f4e09 | 
| 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 | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 15 |   val function: ('a -> 'b option) -> ('a, 'b) function
 | 
| 32017 | 16 | val map: 'a operation -> 'a list operation | 
| 32022 | 17 |   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 | 18 | end; | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 19 | |
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 20 | structure Same: SAME = | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 21 | struct | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 22 | |
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 23 | exception SAME; | 
| 
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 | type ('a, 'b) function = 'a -> 'b;
 | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 26 | type 'a operation = ('a, 'a) function;
 | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 27 | |
| 32025 | 28 | fun same _ = raise SAME; | 
| 32015 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 29 | fun commit f x = f x handle SAME => x; | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 30 | |
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 31 | fun function f x = | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 32 | (case f x of | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 33 | NONE => raise SAME | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 34 | | SOME y => y); | 
| 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 35 | |
| 32017 | 36 | fun map f [] = raise SAME | 
| 37 | | 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 | 38 | |
| 32022 | 39 | fun map_option f NONE = raise SAME | 
| 40 | | map_option f (SOME x) = SOME (f x); | |
| 41 | ||
| 32015 
7101feb5247e
Support for copy-avoiding functions on pure values, at the cost of readability.
 wenzelm parents: diff
changeset | 42 | end; |