Co-authored-by: Ohad Kammar <ohad.kammar@gmail.com>
YE3EAD3XYKXRHEJN4VLBVBQM2EISKFHAESPOZ6S4QMLA6YZEVDQQC data LinkedListEquiv : (a, b : LinkedList t) -> Type whereBothEmpty : LinkedListEquiv Nil NilEquivHeadAndTail : Equivalence t => {a, b : t} -> {x, y : LinkedList t}
data LinkedListEquiv : Equivalence t => (a, b : LinkedList t) -> Type whereBothEmpty : (e : Equivalence t) => LinkedListEquiv @{e} Nil NilEquivHeadAndTail : (e : Equivalence t) => {a, b : t} -> {x, y : LinkedList t}
decEquiv Nil Nil = Yes $ BothEmptydecEquiv Nil (_ :: _) = No $ absurddecEquiv (_ :: _) Nil = No $ absurddecEquiv (h1 :: t1) (h2 :: t2) = case (decEquiv h1 h2, decEquiv t1 t2) of
decLinkedListEquiv : (e : Equivalence t) => (a, b : LinkedList t) -> Dec (LinkedListEquiv @{e} a b)decLinkedListEquiv Nil Nil = Yes $ BothEmptydecLinkedListEquiv Nil (_ :: _) = No $ absurddecLinkedListEquiv (_ :: _) Nil = No $ absurddecLinkedListEquiv @{e} (h1 :: t1) (h2 :: t2) = assert_total $case (decEquiv @{e} h1 h2, decLinkedListEquiv t1 t2) of
(Yes prf1, No ctra2) => No $ fromNotEquivTail ctra2(No ctra1, _) => No $ fromNotEquivHead ctra1_ => ?impossibleCase -- TODO: Upstream bug
(Yes prf1, No ctra2) => No $ fromNotEquivTail @{e} ctra2(No ctra1, _) => No $ fromNotEquivHead @{e} ctra1public export(Equivalence t) => Equivalence (LinkedList t) whereEquiv = LinkedListEquivdecEquiv = decLinkedListEquiv
data OptionalEquiv : (a, b : Optional t) -> Type whereBothNothing : OptionalEquiv Nothing NothingBothSame : Equivalence t => {a, b : t} -> (ok : Equiv a b) -> OptionalEquiv (Some a) (Some b)
data OptionalEquiv : Equivalence t => (a, b : Optional t) -> Type whereBothNothing : (e : Equivalence t) => OptionalEquiv @{e} Nothing NothingBothSame : (e : Equivalence t) => {a, b : t} -> (ok : Equiv a b)-> OptionalEquiv @{e} (Some a) (Some b)