ref: cc5f799ee6b51ce2859a74dbcd36b484d805732c
dir: /tests/Record.hs/
module Record(main) where
import Prelude
-- HasField instances are derived automatically
data R = CR { a :: Int, b :: Bool }
instance Show R where
  show (CR a b) = "CR{a=" ++ show a ++ ",b=" ++ show b ++ "}"
data RR = CRR { r :: R, a :: Bool }
instance Show RR where
  show (CRR r a) = "CRR{r=" ++ show r ++ ",a=" ++ show a ++ "}"
foo :: R -> Int
foo CR{a=aa,b=bb} = if bb then 999 else aa
foop :: R -> Int
foop CR{a,b} = if b then 888 else a
foow :: R -> Int
foow CR{..} = if b then 777 else a
bar :: R -> Int
bar CR{a=aa} = aa
r1 :: R
r1 = CR { a=1, b=True }
r2 :: R
r2 = CR { b=False, a=2 }
r3 :: R
r3 = CR { b=True }
--r4 :: R
--r4 = R { c=True }
r5 :: R
r5 = r1 { a = (10::Int) }
r6 :: R
r6 = r1 { a = (10::Int), b=False }
rr1 :: RR
rr1 = CRR { r = r1, a = True }
r7 :: RR
r7 = rr1{ r.a = 999 }
r8 :: R
r8 =
  let a = 333
      b = True
  in  CR{..}
sel_a :: forall r t . HasField "a" r t => r -> t
sel_a = (.a)
{- does not work yet
sel_ra :: RR -> Int
sel_ra CRR{r.a} = a
-}
data S a = S1 { x :: Int } | S2 { x :: Int, y :: a }
instance forall a . Show a => Show (S a) where
  show (S1 x) = "S1 " ++ show x
  show (S2 x y) = "S2 " ++ show x ++ " " ++ show y
s1 :: S Bool
s1 = S1 10
s2 :: S String
s2 = S2 { x = 20, y = "foo" }
main :: IO ()
main = do
  print r1
  print r2
--  print r3
  print r5
  print r6
  print r7
  print $ r2.a
  print $ r2.b
  print $ rr1.r.a
  print $ (.r.a) rr1
  print $ rr1.a
  print $ (.a) r1
  print $ sel_a r1
  print $ sel_a rr1
  print s1
  print s2
  print s1{x=99}
  print s2{x=88}
  print s2{y="bar"}
  print $ foo r1
  print $ foo r2
  print $ bar r1
  print $ foop r1
  print $ foop r2
  print $ foow r1
  print $ foow r2
--  print $ sel_ra r7
  print r8
  print s1.x
  print s2.x
  print (x s1)
  print (x s2)