shithub: MicroHs

ref: bdd38072a2fa4108fff41da806309074e79ce6de
dir: /tests/Record.hs/

View raw version
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)