@@ -1259,6 +1259,7 @@ module Comonadic_with_regionality = struct
1259
1259
end
1260
1260
1261
1261
include Common (Obj )
1262
+ open Obj
1262
1263
1263
1264
type error =
1264
1265
[ `Regionality of Regionality .error
@@ -1308,6 +1309,11 @@ module Comonadic_with_regionality = struct
1308
1309
(Meet_with (C. max_with Obj. obj Linearity c))
1309
1310
(S.Positive. disallow_right m)
1310
1311
1312
+ let meet_with c m =
1313
+ Solver. via_monotone obj (Meet_with c) (Solver. disallow_right m)
1314
+
1315
+ let imply c m = Solver. via_monotone obj (Imply c) (Solver. disallow_left m)
1316
+
1311
1317
let zap_to_legacy m =
1312
1318
let regionality = regionality m |> Regionality. zap_to_legacy in
1313
1319
let linearity = linearity m |> Linearity. zap_to_legacy in
@@ -1351,6 +1357,7 @@ module Comonadic_with_locality = struct
1351
1357
end
1352
1358
1353
1359
include Common (Obj )
1360
+ open Obj
1354
1361
1355
1362
type error =
1356
1363
[ `Locality of Locality .error
@@ -1405,6 +1412,11 @@ module Comonadic_with_locality = struct
1405
1412
let linearity = linearity m |> Linearity. zap_to_legacy in
1406
1413
locality, linearity
1407
1414
1415
+ let meet_with c m =
1416
+ Solver. via_monotone obj (Meet_with c) (Solver. disallow_right m)
1417
+
1418
+ let imply c m = Solver. via_monotone obj (Imply c) (Solver. disallow_left m)
1419
+
1408
1420
let legacy = of_const Const. legacy
1409
1421
1410
1422
(* overriding to report the offending axis *)
@@ -1443,6 +1455,7 @@ module Monadic = struct
1443
1455
end
1444
1456
1445
1457
include Common (Obj )
1458
+ open Obj
1446
1459
1447
1460
type error = [`Uniqueness of Uniqueness .error ]
1448
1461
@@ -1473,6 +1486,11 @@ module Monadic = struct
1473
1486
(Join_with (C. min_with Obj. obj Uniqueness c))
1474
1487
(S.Negative. disallow_right m)
1475
1488
1489
+ let meet_with c m =
1490
+ Solver. via_monotone obj (Join_with c) (Solver. disallow_right m)
1491
+
1492
+ let imply c m = Solver. via_monotone obj (Subtract c) (Solver. disallow_left m)
1493
+
1476
1494
let zap_to_legacy m =
1477
1495
let uniqueness = uniqueness m |> Uniqueness. zap_to_legacy in
1478
1496
uniqueness, ()
@@ -1514,6 +1532,12 @@ module Value = struct
1514
1532
1515
1533
type lr = (allowed * allowed ) t
1516
1534
1535
+ type ('a, 'b, 'c) modes =
1536
+ { regionality : 'a ;
1537
+ linearity : 'b ;
1538
+ uniqueness : 'c
1539
+ }
1540
+
1517
1541
let min = { comonadic = Comonadic. min; monadic = Monadic. min }
1518
1542
1519
1543
let max =
@@ -1604,23 +1628,26 @@ module Value = struct
1604
1628
1605
1629
let zap_to_floor { comonadic; monadic } =
1606
1630
match Monadic. zap_to_floor monadic, Comonadic. zap_to_floor comonadic with
1607
- | (uniqueness , () ), (locality , linearity ) -> locality, linearity, uniqueness
1631
+ | (uniqueness , () ), (regionality , linearity ) ->
1632
+ { regionality; linearity; uniqueness }
1608
1633
1609
1634
let zap_to_ceil { comonadic; monadic } =
1610
1635
match Monadic. zap_to_ceil monadic, Comonadic. zap_to_ceil comonadic with
1611
- | (uniqueness , () ), (locality , linearity ) -> locality, linearity, uniqueness
1636
+ | (uniqueness , () ), (regionality , linearity ) ->
1637
+ { regionality; linearity; uniqueness }
1612
1638
1613
1639
let zap_to_legacy { comonadic; monadic } =
1614
1640
match Monadic. zap_to_legacy monadic, Comonadic. zap_to_legacy comonadic with
1615
- | (uniqueness , () ), (locality , linearity ) -> locality, linearity, uniqueness
1641
+ | (uniqueness , () ), (regionality , linearity ) ->
1642
+ { regionality; linearity; uniqueness }
1616
1643
1617
1644
let check_const { comonadic; monadic } =
1618
- let locality , linearity = Comonadic. check_const comonadic in
1645
+ let regionality , linearity = Comonadic. check_const comonadic in
1619
1646
let uniqueness = Monadic. check_const monadic in
1620
- locality, linearity, uniqueness
1647
+ { regionality; linearity; uniqueness }
1621
1648
1622
- let of_const ( locality , linearity , uniqueness ) =
1623
- let comonadic = Comonadic. of_const (locality , linearity) in
1649
+ let of_const { regionality; linearity; uniqueness } =
1650
+ let comonadic = Comonadic. of_const (regionality , linearity) in
1624
1651
let monadic = Monadic. of_const (uniqueness, () ) in
1625
1652
{ comonadic; monadic }
1626
1653
@@ -1720,34 +1747,68 @@ module Value = struct
1720
1747
(Comonadic_to_monadic Comonadic.Obj. obj) m
1721
1748
1722
1749
module Const = struct
1723
- type t = Regionality.Const .t * Linearity.Const .t * Uniqueness.Const .t
1750
+ type t = ( Regionality.Const .t , Linearity.Const .t , Uniqueness.Const .t ) modes
1724
1751
1725
- let min = Regionality.Const. min, Linearity.Const. min, Uniqueness.Const. min
1752
+ let split { regionality; linearity; uniqueness } =
1753
+ let monadic = uniqueness, () in
1754
+ let comonadic = regionality, linearity in
1755
+ { comonadic; monadic }
1726
1756
1727
- let max = Regionality.Const. max, Linearity.Const. max, Uniqueness.Const. max
1757
+ let _merge { comonadic; monadic } =
1758
+ let regionality, linearity = comonadic in
1759
+ let uniqueness, () = monadic in
1760
+ { regionality; linearity; uniqueness }
1728
1761
1729
- let le (locality0 , linearity0 , uniqueness0 )
1730
- (locality1 , linearity1 , uniqueness1 ) =
1731
- Regionality.Const. le locality0 locality1
1732
- && Uniqueness.Const. le uniqueness0 uniqueness1
1733
- && Linearity.Const. le linearity0 linearity1
1762
+ let min =
1763
+ { regionality = Regionality.Const. min;
1764
+ linearity = Linearity.Const. min;
1765
+ uniqueness = Uniqueness.Const. min
1766
+ }
1767
+
1768
+ let max =
1769
+ { regionality = Regionality.Const. max;
1770
+ linearity = Linearity.Const. max;
1771
+ uniqueness = Uniqueness.Const. max
1772
+ }
1773
+
1774
+ let le m0 m1 =
1775
+ Regionality.Const. le m0.regionality m1.regionality
1776
+ && Uniqueness.Const. le m0.uniqueness m1.uniqueness
1777
+ && Linearity.Const. le m0.linearity m1.linearity
1734
1778
1735
1779
let print ppf m = print () ppf (of_const m)
1736
1780
1737
1781
let legacy =
1738
- Regionality.Const. legacy, Linearity.Const. legacy, Uniqueness.Const. legacy
1782
+ { regionality = Regionality.Const. legacy;
1783
+ linearity = Linearity.Const. legacy;
1784
+ uniqueness = Uniqueness.Const. legacy
1785
+ }
1739
1786
1740
- let meet (l0 , l1 , l2 ) (r0 , r1 , r2 ) =
1741
- ( Regionality.Const. meet l0 r0,
1742
- Linearity.Const. meet l1 r1,
1743
- Uniqueness.Const. meet l2 r2 )
1787
+ let meet m0 m1 =
1788
+ let regionality = Regionality.Const. meet m0.regionality m1.regionality in
1789
+ let linearity = Linearity.Const. meet m0.linearity m1.linearity in
1790
+ let uniqueness = Uniqueness.Const. meet m0.uniqueness m1.uniqueness in
1791
+ { regionality; linearity; uniqueness }
1744
1792
1745
- let join (l0 , l1 , l2 ) (r0 , r1 , r2 ) =
1746
- ( Regionality.Const. join l0 r0,
1747
- Linearity.Const. join l1 r1,
1748
- Uniqueness.Const. join l2 r2 )
1793
+ let join m0 m1 =
1794
+ let regionality = Regionality.Const. join m0.regionality m1.regionality in
1795
+ let linearity = Linearity.Const. join m0.linearity m1.linearity in
1796
+ let uniqueness = Uniqueness.Const. join m0.uniqueness m1.uniqueness in
1797
+ { regionality; linearity; uniqueness }
1749
1798
end
1750
1799
1800
+ let meet_with c { comonadic; monadic } =
1801
+ let c = Const. split c in
1802
+ let comonadic = Comonadic. meet_with c.comonadic comonadic in
1803
+ let monadic = Monadic. meet_with c.monadic monadic in
1804
+ { monadic; comonadic }
1805
+
1806
+ let imply c { comonadic; monadic } =
1807
+ let c = Const. split c in
1808
+ let comonadic = Comonadic. imply c.comonadic comonadic in
1809
+ let monadic = Monadic. imply c.monadic monadic in
1810
+ { monadic; comonadic }
1811
+
1751
1812
module List = struct
1752
1813
type nonrec 'd t = 'd t list
1753
1814
@@ -1777,6 +1838,12 @@ module Alloc = struct
1777
1838
1778
1839
type lr = (allowed * allowed ) t
1779
1840
1841
+ type ('a, 'b, 'c) modes =
1842
+ { locality : 'a ;
1843
+ linearity : 'b ;
1844
+ uniqueness : 'c
1845
+ }
1846
+
1780
1847
let min = { comonadic = Comonadic. min; monadic = Monadic. min }
1781
1848
1782
1849
let max = { comonadic = Comonadic. min; monadic = Monadic. max }
@@ -1961,20 +2028,14 @@ module Alloc = struct
1961
2028
S.Positive. via_antitone Comonadic.Obj. obj Monadic_to_comonadic_min
1962
2029
(Monadic. disallow_left m)
1963
2030
1964
- module Const = struct
1965
- type ('loc, 'lin, 'uni) modes =
1966
- { locality : 'loc ;
1967
- linearity : 'lin ;
1968
- uniqueness : 'uni
1969
- }
2031
+ let of_const { locality; linearity; uniqueness } =
2032
+ let comonadic = Comonadic. of_const (locality, linearity) in
2033
+ let monadic = Monadic. of_const (uniqueness, () ) in
2034
+ { comonadic; monadic }
1970
2035
2036
+ module Const = struct
1971
2037
type t = (Locality.Const .t , Linearity.Const .t , Uniqueness.Const .t ) modes
1972
2038
1973
- let of_const { locality; linearity; uniqueness } =
1974
- let comonadic = Comonadic. of_const (locality, linearity) in
1975
- let monadic = Monadic. of_const (uniqueness, () ) in
1976
- { comonadic; monadic }
1977
-
1978
2039
let min =
1979
2040
let locality = Locality.Const. min in
1980
2041
let linearity = Linearity.Const. min in
@@ -2059,7 +2120,17 @@ module Alloc = struct
2059
2120
merge { comonadic; monadic }
2060
2121
end
2061
2122
2062
- let of_const = Const. of_const
2123
+ let meet_with c { comonadic; monadic } =
2124
+ let c = Const. split c in
2125
+ let comonadic = Comonadic. meet_with c.comonadic comonadic in
2126
+ let monadic = Monadic. meet_with c.monadic monadic in
2127
+ { monadic; comonadic }
2128
+
2129
+ let imply c { comonadic; monadic } =
2130
+ let c = Const. split c in
2131
+ let comonadic = Comonadic. imply c.comonadic comonadic in
2132
+ let monadic = Monadic. imply c.monadic monadic in
2133
+ { monadic; comonadic }
2063
2134
2064
2135
let zap_to_floor { comonadic; monadic } : Const.t =
2065
2136
match Monadic. zap_to_floor monadic, Comonadic. zap_to_floor comonadic with
@@ -2104,6 +2175,13 @@ module Alloc = struct
2104
2175
{ comonadic; monadic }
2105
2176
end
2106
2177
2178
+ module Const = struct
2179
+ let alloc_as_value ({ locality; linearity; uniqueness } : Alloc.Const.t ) :
2180
+ Value.Const. t =
2181
+ let regionality = C. locality_as_regionality locality in
2182
+ { regionality; linearity; uniqueness }
2183
+ end
2184
+
2107
2185
let alloc_as_value m =
2108
2186
let { comonadic; monadic } = m in
2109
2187
let comonadic =
0 commit comments