ref: cff38fed223a58f0e7181407a4a7fdb7f81a190b
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)