Very importantly, they are in isomorphism with our previous definition of dependent lenses:

Lemma

Closed lenses are isomorphic to dependent lenses

We prove the isomorphism by providing map to and from dependent lenses.

public export
toClosed : a =%> b -> a =&> b
toClosed mor = !!
  \x => mor.fwd x  ## (\y => mor.bwd x y)
 
public export
fromClosed : a =&> b -> a =%> b
fromClosed (!! g) =
  (\x => (g x).π1) <!
  (\x, y => (g x).π2 y)
 
public export
closedIso : a =&> b  (a =%> b)
closedIso = MkIso
  fromClosed
  toClosed
  (\(x <! y) => Refl)
  (\(!! fn) => cong (!!) (funExtDep $ \nx => sigmaProjId _))

This means that everything that worked before, works on closed lenses as well.

export 0
clsEqToDLensEq : ClosedEq m n SigEq -> fromClosed m <%≡%> fromClosed n
clsEqToDLensEq eq = rewrite clsEqToEq SigEq sigEqToEq eq in reflexive
 
export 0
clsEqToDLensEq' : ClosedEq (toClosed m) (toClosed n) SigEq -> m <%≡%> n
-- clsEqToDLensEq' eq = rewrite clsEqToEq SigEq sigEqToEq eq in reflexive
 
export 0
clsEqToPropEq : ClosedEq (toClosed m) (toClosed n) SigEqS -> m === n