{-# LANGUAGE PackageImports #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Data.Generics.Product.Typed
  ( 
    
    
    HasType (..)
  ) where
import "this" Data.Generics.Internal.VL.Lens as VL
import qualified "generic-lens-core" Data.Generics.Product.Internal.Typed as Core
import "generic-lens-core" Data.Generics.Internal.Void
class HasType a s where
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  typed :: VL.Lens s s a a
  typed
    = (s -> a) -> (s -> a -> s) -> Lens s s a a
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
VL.lens (forall s. HasType a s => s -> a
forall a s. HasType a s => s -> a
getTyped @a) ((a -> s -> s) -> s -> a -> s
forall a b c. (a -> b -> c) -> b -> a -> c
flip (forall s. HasType a s => a -> s -> s
forall a s. HasType a s => a -> s -> s
setTyped @a))
  {-# INLINE typed #-}
  
  getTyped :: s -> a
  getTyped s
s = s
s s -> ((a -> Const a a) -> s -> Const a s) -> a
forall s a. s -> ((a -> Const a a) -> s -> Const a s) -> a
^. forall s. HasType a s => Lens s s a a
forall a s. HasType a s => Lens s s a a
typed @a
  
  setTyped :: a -> s -> s
  setTyped = Lens s s a a -> a -> s -> s
forall s t a b. Lens s t a b -> b -> s -> t
VL.set (forall s. HasType a s => Lens s s a a
forall a s. HasType a s => Lens s s a a
typed @a)
  {-# MINIMAL typed | setTyped, getTyped #-}
instance Core.Context a s => HasType a s where
  typed :: (a -> f a) -> s -> f s
typed = (ALens a a Any a a -> ALens a a Any s s) -> Lens s s a a
forall a b i s t.
(ALens a b i a b -> ALens a b i s t) -> Lens s t a b
VL.ravel ALens a a Any a a -> ALens a a Any s s
forall a s. Context a s => Lens s s a a
Core.derived
  {-# INLINE typed #-}
instance {-# OVERLAPPING #-} HasType a a where
    getTyped :: a -> a
getTyped = a -> a
forall a. a -> a
id
    {-# INLINE getTyped #-}
    setTyped :: a -> a -> a
setTyped a
a a
_ = a
a
    {-# INLINE setTyped #-}
instance {-# OVERLAPPING #-} HasType a Void where
  typed :: (a -> f a) -> Void -> f Void
typed = (a -> f a) -> Void -> f Void
forall a. HasCallStack => a
undefined