on bfcd00a help sign in
generic-lens/examples/StarWars.hs
71 lines 1.8 kB history raw
1{-# LANGUAGE DeriveGeneric #-}
2{-# LANGUAGE DuplicateRecordFields #-}
3{-# LANGUAGE UndecidableInstances #-}
4{-# LANGUAGE TypeApplications #-}
5{-# LANGUAGE DataKinds #-}
6{-# LANGUAGE FlexibleContexts #-}
8-- Note: this file may contain spoilers
9-- (although I would be really surprised if it did, I haven't seen the films)
10module StarWars where
12import GHC.Generics
13import Data.Generics.Product
15data Episode = NEWHOPE | EMPIRE | JEDI
16 deriving (Generic, Show, Eq)
18data Character = Character
19 { name :: String
20 , friends :: [Character]
21 , appearsIn :: [Episode]
22 } deriving (Generic, Show, Eq)
24data Human = Human
25 { name :: String
26 , friends :: [Character]
27 , appearsIn :: [Episode]
28 , homePlanet :: String
29 } deriving (Generic, Show)
31data Droid = Droid
32 { friends :: [Character]
33 , appearsIn :: [Episode]
34 , name :: String
35 , primaryFunction :: String
36 } deriving (Generic, Show)
38luke :: Human
39luke = Human
40 { name = "Luke Skywalker"
41 , friends = []
42 , appearsIn = [NEWHOPE, EMPIRE, JEDI]
43 , homePlanet = "Saturn (?)"
44 }
46r2d2 :: Droid
47r2d2 = Droid
48 { name = "R2-D2"
49 , friends = [upcast luke]
50 , appearsIn = [NEWHOPE, EMPIRE, JEDI]
51 , primaryFunction = "repair ships"
52 }
54c3po :: Droid
55c3po = Droid
56 { name = "C3PO"
57 , friends = [upcast r2d2, upcast luke]
58 , appearsIn = [NEWHOPE, EMPIRE, JEDI]
59 , primaryFunction = "protocol and human relations"
60 }
62getName :: HasField "name" a r => r -> a
63getName = getField @"name"
65-- upcast :: Subtype a b => a -> b
66characters :: [Character]
67characters = [upcast r2d2, upcast luke, upcast c3po]
69names :: [String]
70names = map getName characters
71-- => ["R2-D2","Luke Skywalker","C3PO"]