module Data.List.Properties.Extra where
open import Data.List as List using (List; []; _∷_; _++_; _ʳ++_)
import Data.List.Properties as List
open import Function using (_∘_; _|>_)
open import Relation.Binary.PropositionalEquality as Eq using (_≡_; refl)
open Eq.≡-Reasoning
ʳ++-reverse : ∀ {a} {A : Set a} (xs ys : List A) → List.reverse xs ʳ++ List.reverse ys ʳ++ [] ≡ xs ++ ys
ʳ++-reverse xs ys =
begin
List.reverse xs ʳ++ List.reverse ys ʳ++ []
≡⟨ List.ʳ++-defn (List.reverse xs) ⟩
List.reverse (List.reverse xs) ++ List.reverse ys ʳ++ []
≡⟨ List.reverse-involutive xs |> Eq.cong (_++ List.reverse ys ʳ++ []) ⟩
xs ++ List.reverse ys ʳ++ []
≡⟨ List.ʳ++-defn (List.reverse ys) |> Eq.cong (xs ++_) ⟩
xs ++ List.reverse (List.reverse ys) ++ []
≡⟨ List.reverse-involutive ys |> Eq.cong ((xs ++_) ∘ (_++ [])) ⟩
xs ++ ys ++ []
≡⟨ List.++-identityʳ ys |> Eq.cong (xs ++_) ⟩
xs ++ ys
∎