{-# LANGUAGE OverloadedStrings #-} -- | -- Module : Users.dd..dwork.hs.hero-club-five-tenets.ACME.Acme.HeroClub.FiveTenets -- Copyright : I am D. 2015-2016 -- License : BSD3 -- -- Maintainer : d.kupanhy@gmail.com -- Stability : stable -- -- This package give you Hero Club Five Tenets, Yuki Yuna is a Hero. -- module Acme.HeroClub.FiveTenets ( Lang (..) , No (..) , putFiveTenets , putOneTenet , putRndTenet ) 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 -> Lang -> T.Text instance FiveTenets No where tenets One Japan = "挨拶はきちんと!" tenets Two Japan = "なるべく諦めない!" tenets Three Japan = "よく寝て、よく食べる!" tenets Four Japan = "悩んだら相談!" tenets Five Japan = "なせば大抵なんとかなる!" tenets One English = "Give a good greeting!" tenets Two English = "Try not to give up!" tenets Three English = "Sleep well, eat well!" tenets Four English = "If you're troubled, talk to someone!" tenets Five English = "You're likely to succeed if you try!" heroClub :: Lang -> T.Text heroClub Japan = "勇者部五箇条!" heroClub English = "Hero Club Five Tenets!" cnt :: Lang -> T.Text cnt Japan = "一つ、" cnt English = "One, " oneOfTheTenets :: No -> T.Text oneOfTheTenets n = heroClub Japan `T.append` " " `T.append` cnt Japan `T.append` tenets n Japan fiveTenets :: T.Text fiveTenets = heroClub Japan `T.append` "\n" `T.append` foldl T.append T.empty ( map (flip T.snoc '\n' . T.append (cnt Japan) . flip tenets Japan) [minBound :: No .. maxBound :: No] ) -- | Dispaly Five Tenets on the Dispaly. -- -- @ -- >>> putFiveTenets -- 勇者部五箇条! -- 一つ、挨拶はきちんと! -- 一つ、なるべく諦めない! -- 一つ、よく寝て、よく食べる! -- 一つ、悩んだら相談! -- 一つ、なせば大抵なんとかなる! -- @ -- putFiveTenets :: IO () putFiveTenets = T.putStr fiveTenets -- | Dispaly one of five tenets you have selected. -- -- @ -- >>> putOneTenet Five -- 勇者部五箇条! 一つ、なせば大抵なんとかなる! -- -- >>> putOneTenet Two -- 勇者部五箇条! 一つ、なるべく諦めない! -- @ -- putOneTenet :: No -> IO () putOneTenet = T.putStrLn . oneOfTheTenets -- | Dispaly one of five tenets at random. putRndTenet :: IO () putRndTenet = do gen <- newStdGen let (n, _) = randomR (0,4) gen :: (Int, StdGen) let no = [minBound :: No .. maxBound :: No] !! n putOneTenet no