{-# LANGUAGE PackageImports #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Generics.Product.Subtype
(
Subtype (..)
) where
import "this" Data.Generics.Internal.VL.Lens as VL
import "generic-lens-core" Data.Generics.Internal.Void
import qualified "generic-lens-core" Data.Generics.Product.Internal.Subtype as Core
import GHC.Generics (Generic (to, from) )
class Subtype sup sub where
super :: VL.Lens sub sub sup sup
super
= forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
VL.lens forall sup sub. Subtype sup sub => sub -> sup
upcast (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall sup sub. Subtype sup sub => sup -> sub -> sub
smash)
{-# INLINE super #-}
upcast :: sub -> sup
upcast sub
s = sub
s forall s a. s -> ((a -> Const a a) -> s -> Const a s) -> a
^. forall sup sub. Subtype sup sub => Lens sub sub sup sup
super @sup
{-# INLINE upcast #-}
smash :: sup -> sub -> sub
smash = forall s t a b. Lens s t a b -> b -> s -> t
VL.set (forall sup sub. Subtype sup sub => Lens sub sub sup sup
super @sup)
{-# INLINE smash #-}
{-# MINIMAL super | smash, upcast #-}
instance Core.Context a b => Subtype b a where
smash :: b -> a -> a
smash b
p a
b = forall a x. Generic a => Rep a x -> a
to forall a b. (a -> b) -> a -> b
$ forall {k} (sub :: k -> *) (sup :: k -> *) (p :: k).
GSmash sub sup =>
sup p -> sub p -> sub p
Core.gsmash (forall a x. Generic a => a -> Rep a x
from b
p) (forall a x. Generic a => a -> Rep a x
from a
b)
upcast :: a -> b
upcast = forall a x. Generic a => Rep a x -> a
to forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (sub :: * -> *) (sup :: * -> *) p.
GUpcast sub sup =>
sub p -> sup p
Core.gupcast forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPPING #-} Subtype a a where
super :: Lens a a a a
super = forall a. a -> a
id
instance {-# OVERLAPPING #-} Subtype a Void where
super :: Lens Void Void a a
super = forall a. HasCallStack => a
undefined
instance {-# OVERLAPPING #-} Subtype Void a where
super :: Lens a a Void Void
super = forall a. HasCallStack => a
undefined