{-# OPTIONS --without-K --safe #-} module Prelude.Functor where open import Agda.Primitive open import Prelude.Function open import Prelude.Relation.PropositionalEquality private variable A B C : Set _ record Functor (F : {a : Level} → Set a → Set a) : Setω where infixl 4 _<$>_ _<$_ field fmap : (A → B) → F A → F B _<$>_ : (A → B) → F A → F B _<$>_ = fmap {-# INLINE _<$>_ #-} _<$_ : A → F B → F A x <$ m = fmap (λ _ → x) m {-# INLINE _<$_ #-} open Functor {{...}} public {-# DISPLAY Functor.fmap _ = fmap #-} {-# DISPLAY Functor._<$>_ _ = _<$>_ #-} {-# DISPLAY Functor._<$_ _ = _<$_ #-} record FunctorLaw (F : {a : Level} → Set a → Set a) : Setω where field overlap ⦃ super ⦄ : Functor F fmap-cong : ∀ {a b} {A : Set a} {B : Set b} → (f g : A → B) → ((x : A) → f x ≡ g x) → (x : F A) → fmap f x ≡ fmap g x fmap-id : ∀ {a} {A : Set a} (x : F A) → fmap id x ≡ x fmap-comp : ∀ {a b c} {A : Set a} {B : Set b} {C : Set c} → (f : B → C) (g : A → B) → (x : F A) → fmap (f ∘ g) x ≡ (fmap f ∘ fmap g) x open FunctorLaw ⦃ ... ⦄ public {-# DISPLAY FunctorLaw.fmap-cong _ = fmap-cong #-} {-# DISPLAY FunctorLaw.fmap-id _ = fmap-id #-} {-# DISPLAY FunctorLaw.fmap-comp _ = fmap-comp #-}