module Acme.HeroClub.FiveTenets
( Lang (..)
, No (..)
, putFiveTenetsIn
, putOneTenetIn
, putRndTenetIn
) where
import qualified Data.Text as T
import qualified Data.Text.IO as T
import System.Random (StdGen, newStdGen, randomR)
data Lang = Japan | English
data No = One | Two | Three | Four | Five deriving ( Bounded, Enum )
class FiveTenets t where
tenets :: t -> No -> T.Text
instance FiveTenets Lang where
tenets Japan One = "挨拶はきちんと!"
tenets Japan Two = "なるべく諦めない!"
tenets Japan Three = "よく寝て、よく食べる!"
tenets Japan Four = "悩んだら相談!"
tenets Japan Five = "なせば大抵なんとかなる!"
tenets English One = "Give a good greeting!"
tenets English Two = "Try not to give up!"
tenets English Three = "Sleep well, eat well!"
tenets English Four = "If you're troubled, talk to someone!"
tenets English Five = "You're likely to succeed if you try!"
title :: T.Text -> T.Text
title t = "-- " `T.append` t `T.append` " --"
heroClub :: Lang -> T.Text
heroClub Japan = "勇者部五箇条!"
heroClub English = "Hero Club Five Tenets!"
cnt :: Lang -> T.Text
cnt Japan = "一つ、"
cnt English = "One, "
oneOfTheTenetsIn :: Lang -> No -> T.Text
oneOfTheTenetsIn lang no = heroClub lang `T.append` " " `T.append` cnt lang `T.append` tenets lang no
fiveTenetsIn :: Lang -> T.Text
fiveTenetsIn lang = title (heroClub lang) `T.append` "\n" `T.append` foldl T.append T.empty ( map (flip T.snoc '\n' . T.append (cnt lang) . tenets lang) [minBound :: No .. maxBound :: No] )
putFiveTenetsIn :: Lang -> IO ()
putFiveTenetsIn = T.putStr . fiveTenetsIn
putOneTenetIn :: Lang -> No -> IO ()
putOneTenetIn lang no = T.putStrLn $ oneOfTheTenetsIn lang no
putRndTenetIn :: Lang -> IO ()
putRndTenetIn lang = do
gen <- newStdGen
let (n, _) = randomR (0,4) gen :: (Int, StdGen)
let no = [minBound :: No .. maxBound :: No] !! n
putOneTenetIn lang no