{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -funfolding-keeness-factor=100 #-}
module Main (module Main) where
import Data.Generics.Optics.Lite (HasField, field)
import GHC.Generics (Generic)
import Optics.Core (A_Lens, LabelOptic (..), Lens')
main :: IO ()
main = return ()
-------------------------------------------------------------------------------
-- Big record
-------------------------------------------------------------------------------
data Ex = Ex
{ exA :: Int
, exB :: Bool
, ex0 :: Char
, ex1 :: Char
, ex2 :: Char
, ex3 :: Char
, ex4 :: Char
, ex5 :: Char
, ex6 :: Char
, ex7 :: Char
, ex8 :: Char
, ex9 :: Char
} deriving (Generic)
instance (HasField name Ex a, a ~ b) => LabelOptic name A_Lens Ex Ex a b where
labelOptic = field @name
_exA :: Lens' Ex Int
_exA = field @"exA"
_exA' :: Lens' Ex Int
_exA' = #exA
_exB :: Lens' Ex Bool
_exB = field @"exB"
_ex4 :: Lens' Ex Char
_ex4 = field @"ex4"
-------------------------------------------------------------------------------
-- Sum of records
-------------------------------------------------------------------------------
data Ex2
= Ex2A { exC :: Char }
| Ex2B { exC :: Char }
deriving (Generic)
_exC :: Lens' Ex2 Char
_exC = field @"exC"