-- Copyright 2024 Shea Levy
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UnicodeSyntax #-}

{- |
Description : A known-parametric 'Functor' typeclass.
Copyright   : Copyright 2024 Shea Levy.
License     : Apache-2.0
Maintainer  : shea@shealevy.com
-}
module Data.Functor.Parametric where

import Data.Coerce

{- | 'Functor's which are [properly](http://oleg.fi/gists/posts/2019-07-31-fmap-coerce-coerce.html) parametric.

Laws:

  * @fmap coerce@ = @coerce@
-}
class (Functor f,  x y. (Coercible x y)  Coercible (f x) (f y))  ParametricFunctor f

-- | Any lawful 'Functor' is (almost certainly) already a lawful instance.
instance (Functor f,  x y. (Coercible x y)  Coercible (f x) (f y))  ParametricFunctor f