content: module RegisteredUser where
  
  newtype Username = Username String
  newtype AccountNumber = AccountNumber Integer
  
  data User = UnregisteredUser
            | RegisteredUser Username AccountNumber
  
  printUser :: User -> IO ()
  printUser UnregisteredUser = putStrLn "UnregisteredUser"
  printUser (RegisteredUser (Username name)
                               (AccountNumber acctNum))
      = putStrLn $ name ++ " " ++ show acctNum
  
  data WherePenguinsLive =
      Galapagos
          | Antarctica
          | Australia
          | SouthAfrica
          | SouthAmerica
          | NewZealand
      deriving (Eq, Show)
  
  data Penguin =
      Peng WherePenguinsLive
      deriving (Eq, Show)
  
  isSouthAfrica :: WherePenguinsLive -> Bool
  isSouthAfrica SouthAfrica = True
  isSouthAfrica _ = False
  
  gimmeWhereTheyLive :: Penguin -> WherePenguinsLive
  gimmeWhereTheyLive (Peng whereitlives) = whereitlives
  
  humboldt = Peng SouthAmerica
  gentoo = Peng Antarctica
  macaroni = Peng Antarctica
  little = Peng Australia
  galapagos = Peng Galapagos
  
  galapagosPenguin :: Penguin -> Bool
  galapagosPenguin (Peng Galapagos) = True
  galapagosPenguin _ = False
  
  antarcticPenguin :: Penguin -> Bool
  antarcticPenguin (Peng Antarctica) = True
  antarcticPenguin _ = False
  
  antarcticOrGalapagos :: Penguin -> Bool
  antarcticOrGalapagos p =
    (galapagosPenguin p) || (antarcticPenguin p)
  
  