{-# OPTIONS --cubical --safe #-} module Lens.Composition where open import Prelude open import Lens.Definition open import Lens.Operators infixr 9 _⋯_ _⋯_ : Lens A B → Lens B C → Lens A C fst (ab ⋯ bc) xs = ac where ab-xs : LensPart _ _ ab-xs = fst ab xs bc-ys : LensPart _ _ bc-ys = fst bc (get ab-xs) ac : LensPart _ _ get ac = get bc-ys set ac v = set ab-xs (set bc-ys v) get-set (snd (ab ⋯ bc)) s v = cong (getter bc) (get-set (snd ab) s _) ; bc .snd .get-set (get (fst ab s)) v set-get (snd (ab ⋯ bc)) s = cong (setter ab s) (set-get (snd bc) (get (fst ab s))) ; set-get (snd ab) s set-set (snd (ab ⋯ bc)) s v₁ v₂ = set-set (snd ab) s _ _ ; cong (setter ab s) (cong (flip (setter bc) v₂) (get-set (snd ab) _ _) ; set-set (snd bc) _ _ _)