summaryrefslogtreecommitdiff
path: root/src/Inky/OnlyWhen.idr
diff options
context:
space:
mode:
authorGreg Brown <greg.brown01@ed.ac.uk>2024-08-14 19:06:23 +0100
committerGreg Brown <greg.brown01@ed.ac.uk>2024-08-14 19:06:23 +0100
commit4b2c62a7f07391645d71291c29715404ec619f02 (patch)
tree8cdee4a571ed2169078f7e5de228c9604a2e7670 /src/Inky/OnlyWhen.idr
parent18547332435c0e33106763daa9d8532c9df09115 (diff)
Define kinds and monotypes.
Diffstat (limited to 'src/Inky/OnlyWhen.idr')
-rw-r--r--src/Inky/OnlyWhen.idr44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/Inky/OnlyWhen.idr b/src/Inky/OnlyWhen.idr
new file mode 100644
index 0000000..7bed91a
--- /dev/null
+++ b/src/Inky/OnlyWhen.idr
@@ -0,0 +1,44 @@
+module Inky.OnlyWhen
+
+import Data.DPair
+
+public export
+data OnlyWhen : Maybe a -> (a -> Type) -> Type where
+ Yes : forall x. (px : p x) -> Just x `OnlyWhen` p
+ No : ((x : a) -> Not (p x)) -> Nothing `OnlyWhen` p
+
+public export
+decDPair : (v ** v `OnlyWhen` p) <=> Dec (x : a ** p x)
+decDPair =
+ MkEquivalence
+ { leftToRight = \case
+ (Just x ** Yes px) => Yes (x ** px)
+ (Nothing ** No prf) => No (\(x ** px) => prf x px)
+ , rightToLeft = \case
+ Yes (x ** px) => (Just x ** Yes px)
+ No prf => (Nothing ** No (\x, px => prf (x ** px)))
+ }
+
+public export
+decExists : Exists (`OnlyWhen` p) <=> Dec (Exists p)
+decExists =
+ MkEquivalence
+ { leftToRight = \case
+ Evidence .(Just x) (Yes px) => Yes (Evidence x px)
+ Evidence .(Nothing) (No prf) => No (\(Evidence x px) => void (prf x px))
+ , rightToLeft = \case
+ Yes (Evidence x px) => Evidence (Just x) (Yes px)
+ No prf => Evidence Nothing (No (\x, px => prf (Evidence x px)))
+ }
+
+public export
+decSubset : Subset (Maybe a) (`OnlyWhen` p) <=> Dec (Subset a p)
+decSubset =
+ MkEquivalence
+ { leftToRight = \case
+ Element (Just x) prf => Yes (Element x (case prf of Yes px => px))
+ Element Nothing prf => No (\(Element x px) => void (case prf of No prf => prf x px))
+ , rightToLeft = \case
+ Yes (Element x px) => Element (Just x) (Yes px)
+ No prf => Element Nothing (No (\x, px => prf (Element x px)))
+ }