{-# 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