typesafe-precure 0.3.1.1 → 0.4.0.0
raw patch · 12 files changed
+1668/−198 lines, 12 filesdep +aesondep +aeson-prettydep +bytestring
Dependencies added: aeson, aeson-pretty, bytestring, text, th-strict-compat, th-utilities
Files
- CHANGELOG.md +6/−0
- gen/cure-index.json +1/−0
- gen/pretty-cure-index.json +1034/−0
- src/ACME/PreCure/Index.hs +63/−0
- src/ACME/PreCure/Index/Lib.hs +69/−0
- src/ACME/PreCure/Index/Types.hs +144/−0
- src/ACME/PreCure/Textbook/KirakiraALaMode/Instances.hs +0/−105
- src/ACME/PreCure/Textbook/KirakiraALaMode/Profiles.hs +203/−0
- src/ACME/PreCure/Textbook/KirakiraALaMode/Types.hs +15/−19
- src/ACME/PreCure/Textbook/KirakiraALaMode/Words.hs +0/−30
- src/ACME/PreCure/Types/TH.hs +106/−28
- typesafe-precure.cabal +27/−16
CHANGELOG.md view
@@ -1,3 +1,9 @@+# 0.4.0.0 (2017/10/07)++- Add: More transformations and purifications of Kirakira :star: PreCure A La Mode, including Cure Parfait's and Kirakiraru Creamer's.+- Add: Experimental feature: [cure-index.json](https://github.com/igrep/typesafe-precure/blob/master/gen/cure-index.json) and [pretty-cure-index.json](https://github.com/igrep/typesafe-precure/blob/master/gen/pretty-cure-index.json) are generated at build-time by Template Haskell.+ - Currently, only data of Kirakira :star: A La Mode is collected.+ # 0.3.1.1 (2017/06/05) - Improve documentation :memo: : Add README and CHANGELOG to extra-source-files, to make README readable on hackage.org.
+ gen/cure-index.json view
@@ -0,0 +1,1 @@+{"girls":[{"id":"Ichika","nameEn":"Ichika Usami","nameJa":"宇佐美 いちか"},{"id":"Himari","nameEn":"Himari Arisugawa","nameJa":"有栖川 ひまり"},{"id":"Aoi","nameEn":"Aoi Tategami","nameJa":"立神 あおい"},{"id":"Yukari","nameEn":"Yukari Kotozume","nameJa":"琴爪 ゆかり"},{"id":"Akira","nameEn":"Akira Kenjo","nameJa":"剣城 あきら"},{"id":"Ciel","nameEn":"Ciel Kirahoshi","nameJa":"キラ星 シエル"}],"transformees":[{"id":"CureWhip","nameEn":"Cure Whip","nameJa":"キュアホイップ","introducesHerselfAs":"ショートケーキ!元気と笑顔を!レッツ・ラ・まぜまぜ!キュアホイップ!できあがり!","variation":""},{"id":"CureCustard","nameEn":"Cure Custard","nameJa":"キュアカスタード","introducesHerselfAs":"プリン!知性と勇気を!レッツ・ラ・まぜまぜ!キュアカスタード!できあがり!","variation":""},{"id":"CureGelato","nameEn":"Cure Gelato","nameJa":"キュアジェラート","introducesHerselfAs":"アイス!自由と情熱を!レッツ・ラ・まぜまぜ!キュアジェラート!できあがり!","variation":""},{"id":"CureMacaron","nameEn":"Cure Macaron","nameJa":"キュアマカロン","introducesHerselfAs":"マカロン!美しさとトキメキを!レッツ・ラ・まぜまぜ!キュアマカロン!できあがり!","variation":""},{"id":"CureChocolat","nameEn":"Cure Chocolat","nameJa":"キュアショコラ","introducesHerselfAs":"チョコレート!強さと愛を!レッツ・ラ・まぜまぜ!キュアショコラ!できあがり!","variation":""},{"id":"CureParfait","nameEn":"Cure Parfait","nameJa":"キュアパルフェ","introducesHerselfAs":"パフェ!夢と希望を!レッツ・ラ・まぜまぜ!キュアパルフェ!できあがり!","variation":""}],"specialItems":[{"id":"SweetsPact","nameEn":"Sweets Pact","nameJa":"スイーツパクト","attachments":["Animal Sweets"]},{"id":"RabbitShortcake","nameEn":"Rabbit Shortcake","nameJa":"うさぎショートケーキ","attachments":[]},{"id":"SquirrelPudding","nameEn":"Squirrel Pudding","nameJa":"りすプリン","attachments":[]},{"id":"LionIce","nameEn":"Lion Ice","nameJa":"らいおんアイス","attachments":[]},{"id":"CatMacaron","nameEn":"Cat Macaron","nameJa":"ねこマカロン","attachments":[]},{"id":"DogChocolate","nameEn":"Dog Chocolate","nameJa":"いぬチョコレート","attachments":[]},{"id":"PegasusParfait","nameEn":"Pegasus Parfait","nameJa":"ペガサスパフェ","attachments":[]},{"id":"CandyRod","nameEn":"Candy Rod","nameJa":"キャンディロッド","attachments":[]},{"id":"RainbowRibbon","nameEn":"Rainbow Ribbon","nameJa":"レインボーリボン","attachments":[]},{"id":"KirakiraruCreamer","nameEn":"Kirakiraru Creamer","nameJa":"キラキラルクリーマー","attachments":["Crystal Animal"]},{"id":"CrystalAnimalRabbit","nameEn":"Crystal Animal Rabbit","nameJa":"クリスタルアニマルうさぎ","attachments":[]},{"id":"CrystalAnimalSquirrel","nameEn":"Crystal Animal Squirrel","nameJa":"クリスタルアニマルりす","attachments":[]},{"id":"CrystalAnimalLion","nameEn":"Crystal Animal Lion","nameJa":"クリスタルアニマルらいおん","attachments":[]},{"id":"CrystalAnimalCat","nameEn":"Crystal Animal Cat","nameJa":"クリスタルアニマルねこ","attachments":[]},{"id":"CrystalAnimalDog","nameEn":"Crystal Animal Dog","nameJa":"クリスタルアニマルいぬ","attachments":[]},{"id":"CrystalAnimalPegasus","nameEn":"Crystal Animal Pegasus","nameJa":"クリスタルアニマルペガサス","attachments":[]}],"transformations":[{"transformers":["Ichika"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"}],"transformees":["CureWhip"],"speech":["キュアラモード・デコレーション!","ショートケーキ!","元気と笑顔を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!"]},{"transformers":["Himari"],"specialItems":[{"a":["SquirrelPudding"],"i":"SweetsPact"}],"transformees":["CureCustard"],"speech":["キュアラモード・デコレーション!","プリン!","知性と勇気を!","レッツ・ラ・まぜまぜ!","キュアカスタード!できあがり!"]},{"transformers":["Aoi"],"specialItems":[{"a":["LionIce"],"i":"SweetsPact"}],"transformees":["CureGelato"],"speech":["キュアラモード・デコレーション!","アイス!","自由と情熱を!","レッツ・ラ・まぜまぜ!","キュアジェラート!できあがり!"]},{"transformers":["Yukari"],"specialItems":[{"a":["CatMacaron"],"i":"SweetsPact"}],"transformees":["CureMacaron"],"speech":["キュアラモード・デコレーション!","マカロン!","美しさとトキメキを!","レッツ・ラ・まぜまぜ!","キュアマカロン!できあがり!"]},{"transformers":["Akira"],"specialItems":[{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureChocolat"],"speech":["キュアラモード・デコレーション!","チョコレート!","強さと愛を!","レッツ・ラ・まぜまぜ!","キュアショコラ!できあがり!"]},{"transformers":["Ciel"],"specialItems":[{"a":["PegasusParfait"],"i":"SweetsPact"}],"transformees":["CureParfait"],"speech":["キュアラモード・デコレーション!","パフェ!","夢と希望を!","レッツ・ラ・まぜまぜ!","キュアパルフェ!できあがり!"]},{"transformers":["Ichika","Himari","Aoi","Yukari","Akira"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション!","ショートケーキ!","元気と笑顔を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Ichika","Himari","Aoi","Yukari","Akira","Ciel"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"},{"a":["PegasusParfait"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat","CureParfait"],"speech":["キュアラモード・デコレーション!","ショートケーキ!","元気と笑顔を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キュアパルフェ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Himari","Ichika","Aoi","Yukari","Akira"],"specialItems":[{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureCustard","CureWhip","CureGelato","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション!","プリン!","知性と勇気を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Aoi","Ichika","Himari","Yukari","Akira"],"specialItems":[{"a":["LionIce"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureGelato","CureWhip","CureCustard","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション!","アイス!","自由と情熱を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Yukari","Ichika","Himari","Aoi","Akira"],"specialItems":[{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureMacaron","CureWhip","CureCustard","CureGelato","CureChocolat"],"speech":["キュアラモード・デコレーション!","マカロン!","美しさとトキメキを!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Akira","Ichika","Himari","Aoi","Yukari"],"specialItems":[{"a":["DogChocolate"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"}],"transformees":["CureChocolat","CureWhip","CureCustard","CureGelato","CureMacaron"],"speech":["キュアラモード・デコレーション!","チョコレート!","強さと愛を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Ciel","Ichika","Himari","Aoi","Yukari","Akira"],"specialItems":[{"a":["PegasusParfait"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureParfait","CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション!","パフェ!","夢と希望を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!","キュアショコラ!できあがり!","キュアパルフェ!できあがり!","キラキラ☆プリキュアアラモード!"]},{"transformers":["Ichika","Himari","Aoi"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato"],"speech":["キュアラモード・デコレーション!","ショートケーキ!","元気と笑顔を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!"]},{"transformers":["Ichika","Himari","Aoi","Yukari"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato","CureMacaron"],"speech":["キュアラモード・デコレーション!","ショートケーキ!","元気と笑顔を!","レッツ・ラ・まぜまぜ!","キュアホイップ!できあがり!","キュアカスタード!できあがり!","キュアジェラート!できあがり!","キュアマカロン!できあがり!"]},{"transformers":["Yukari","Akira"],"specialItems":[{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション!","マカロン!","美しさとトキメキを!","レッツ・ラ・まぜまぜ!","キュアマカロン!できあがり!","キュアショコラ!できあがり!"]}],"purifications":[{"purifier":["CureWhip"],"specialItems":["CandyRod"],"speech":["キラキラキラルン!","ホイップ・デコレーション!"]},{"purifier":["CureCustard"],"specialItems":["CandyRod"],"speech":["キラキラキラルン!","カスタード・イリュージョン!"]},{"purifier":["CureGelato"],"specialItems":["CandyRod"],"speech":["キラキラキラルン!","ジェラート・シェイク!"]},{"purifier":["CureMacaron"],"specialItems":["CandyRod"],"speech":["キラキラキラルン!","マカロン・ジュリエンヌ!","にゃーお♥"]},{"purifier":["CureChocolat"],"specialItems":["CandyRod"],"speech":["キラキラキラルン!","ショコラ・アロマーゼ!"]},{"purifier":["CureParfait"],"specialItems":["RainbowRibbon"],"speech":["レインボーリボン!","行くよ!アン・ドゥ・トレビアン!","キラクル・レインボー!","ボナペティ!"]},{"purifier":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat"],"specialItems":["CandyRod"],"speech":["キャンディーロッド!","キラキラキラル・フルチャージ!","スイー・ツー・ワンダフル・アラモード!"]},{"purifier":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat","CureParfait"],"specialItems":[{"a":["CrystalAnimalRabbit"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalSquirrel"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalLion"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalCat"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalDog"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalPegasus"],"i":"KirakiraruCreamer"}],"speech":["キラキラルクリーマー!","キラッと輝け!クリスタルアニマル!","ぴょーん!","くるるっ!","がぁおー!","にゃーお!","わん!","ぱたた!","プリキュア・アニマルゴーランド!"]}]}
+ gen/pretty-cure-index.json view
@@ -0,0 +1,1034 @@+{+ "specialItems": [+ {+ "nameEn": "Sweets Pact",+ "attachments": [+ "Animal Sweets"+ ],+ "nameJa": "スイーツパクト",+ "id": "SweetsPact"+ },+ {+ "nameEn": "Rabbit Shortcake",+ "attachments": [],+ "nameJa": "うさぎショートケーキ",+ "id": "RabbitShortcake"+ },+ {+ "nameEn": "Squirrel Pudding",+ "attachments": [],+ "nameJa": "りすプリン",+ "id": "SquirrelPudding"+ },+ {+ "nameEn": "Lion Ice",+ "attachments": [],+ "nameJa": "らいおんアイス",+ "id": "LionIce"+ },+ {+ "nameEn": "Cat Macaron",+ "attachments": [],+ "nameJa": "ねこマカロン",+ "id": "CatMacaron"+ },+ {+ "nameEn": "Dog Chocolate",+ "attachments": [],+ "nameJa": "いぬチョコレート",+ "id": "DogChocolate"+ },+ {+ "nameEn": "Pegasus Parfait",+ "attachments": [],+ "nameJa": "ペガサスパフェ",+ "id": "PegasusParfait"+ },+ {+ "nameEn": "Candy Rod",+ "attachments": [],+ "nameJa": "キャンディロッド",+ "id": "CandyRod"+ },+ {+ "nameEn": "Rainbow Ribbon",+ "attachments": [],+ "nameJa": "レインボーリボン",+ "id": "RainbowRibbon"+ },+ {+ "nameEn": "Kirakiraru Creamer",+ "attachments": [+ "Crystal Animal"+ ],+ "nameJa": "キラキラルクリーマー",+ "id": "KirakiraruCreamer"+ },+ {+ "nameEn": "Crystal Animal Rabbit",+ "attachments": [],+ "nameJa": "クリスタルアニマルうさぎ",+ "id": "CrystalAnimalRabbit"+ },+ {+ "nameEn": "Crystal Animal Squirrel",+ "attachments": [],+ "nameJa": "クリスタルアニマルりす",+ "id": "CrystalAnimalSquirrel"+ },+ {+ "nameEn": "Crystal Animal Lion",+ "attachments": [],+ "nameJa": "クリスタルアニマルらいおん",+ "id": "CrystalAnimalLion"+ },+ {+ "nameEn": "Crystal Animal Cat",+ "attachments": [],+ "nameJa": "クリスタルアニマルねこ",+ "id": "CrystalAnimalCat"+ },+ {+ "nameEn": "Crystal Animal Dog",+ "attachments": [],+ "nameJa": "クリスタルアニマルいぬ",+ "id": "CrystalAnimalDog"+ },+ {+ "nameEn": "Crystal Animal Pegasus",+ "attachments": [],+ "nameJa": "クリスタルアニマルペガサス",+ "id": "CrystalAnimalPegasus"+ }+ ],+ "transformees": [+ {+ "nameEn": "Cure Whip",+ "nameJa": "キュアホイップ",+ "id": "CureWhip",+ "introducesHerselfAs": "ショートケーキ!元気と笑顔を!レッツ・ラ・まぜまぜ!キュアホイップ!できあがり!",+ "variation": ""+ },+ {+ "nameEn": "Cure Custard",+ "nameJa": "キュアカスタード",+ "id": "CureCustard",+ "introducesHerselfAs": "プリン!知性と勇気を!レッツ・ラ・まぜまぜ!キュアカスタード!できあがり!",+ "variation": ""+ },+ {+ "nameEn": "Cure Gelato",+ "nameJa": "キュアジェラート",+ "id": "CureGelato",+ "introducesHerselfAs": "アイス!自由と情熱を!レッツ・ラ・まぜまぜ!キュアジェラート!できあがり!",+ "variation": ""+ },+ {+ "nameEn": "Cure Macaron",+ "nameJa": "キュアマカロン",+ "id": "CureMacaron",+ "introducesHerselfAs": "マカロン!美しさとトキメキを!レッツ・ラ・まぜまぜ!キュアマカロン!できあがり!",+ "variation": ""+ },+ {+ "nameEn": "Cure Chocolat",+ "nameJa": "キュアショコラ",+ "id": "CureChocolat",+ "introducesHerselfAs": "チョコレート!強さと愛を!レッツ・ラ・まぜまぜ!キュアショコラ!できあがり!",+ "variation": ""+ },+ {+ "nameEn": "Cure Parfait",+ "nameJa": "キュアパルフェ",+ "id": "CureParfait",+ "introducesHerselfAs": "パフェ!夢と希望を!レッツ・ラ・まぜまぜ!キュアパルフェ!できあがり!",+ "variation": ""+ }+ ],+ "girls": [+ {+ "nameEn": "Ichika Usami",+ "nameJa": "宇佐美 いちか",+ "id": "Ichika"+ },+ {+ "nameEn": "Himari Arisugawa",+ "nameJa": "有栖川 ひまり",+ "id": "Himari"+ },+ {+ "nameEn": "Aoi Tategami",+ "nameJa": "立神 あおい",+ "id": "Aoi"+ },+ {+ "nameEn": "Yukari Kotozume",+ "nameJa": "琴爪 ゆかり",+ "id": "Yukari"+ },+ {+ "nameEn": "Akira Kenjo",+ "nameJa": "剣城 あきら",+ "id": "Akira"+ },+ {+ "nameEn": "Ciel Kirahoshi",+ "nameJa": "キラ星 シエル",+ "id": "Ciel"+ }+ ],+ "purifications": [+ {+ "specialItems": [+ "CandyRod"+ ],+ "speech": [+ "キラキラキラルン!",+ "ホイップ・デコレーション!"+ ],+ "purifier": [+ "CureWhip"+ ]+ },+ {+ "specialItems": [+ "CandyRod"+ ],+ "speech": [+ "キラキラキラルン!",+ "カスタード・イリュージョン!"+ ],+ "purifier": [+ "CureCustard"+ ]+ },+ {+ "specialItems": [+ "CandyRod"+ ],+ "speech": [+ "キラキラキラルン!",+ "ジェラート・シェイク!"+ ],+ "purifier": [+ "CureGelato"+ ]+ },+ {+ "specialItems": [+ "CandyRod"+ ],+ "speech": [+ "キラキラキラルン!",+ "マカロン・ジュリエンヌ!",+ "にゃーお♥"+ ],+ "purifier": [+ "CureMacaron"+ ]+ },+ {+ "specialItems": [+ "CandyRod"+ ],+ "speech": [+ "キラキラキラルン!",+ "ショコラ・アロマーゼ!"+ ],+ "purifier": [+ "CureChocolat"+ ]+ },+ {+ "specialItems": [+ "RainbowRibbon"+ ],+ "speech": [+ "レインボーリボン!",+ "行くよ!アン・ドゥ・トレビアン!",+ "キラクル・レインボー!",+ "ボナペティ!"+ ],+ "purifier": [+ "CureParfait"+ ]+ },+ {+ "specialItems": [+ "CandyRod"+ ],+ "speech": [+ "キャンディーロッド!",+ "キラキラキラル・フルチャージ!",+ "スイー・ツー・ワンダフル・アラモード!"+ ],+ "purifier": [+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron",+ "CureChocolat"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "CrystalAnimalRabbit"+ ],+ "i": "KirakiraruCreamer"+ },+ {+ "a": [+ "CrystalAnimalSquirrel"+ ],+ "i": "KirakiraruCreamer"+ },+ {+ "a": [+ "CrystalAnimalLion"+ ],+ "i": "KirakiraruCreamer"+ },+ {+ "a": [+ "CrystalAnimalCat"+ ],+ "i": "KirakiraruCreamer"+ },+ {+ "a": [+ "CrystalAnimalDog"+ ],+ "i": "KirakiraruCreamer"+ },+ {+ "a": [+ "CrystalAnimalPegasus"+ ],+ "i": "KirakiraruCreamer"+ }+ ],+ "speech": [+ "キラキラルクリーマー!",+ "キラッと輝け!クリスタルアニマル!",+ "ぴょーん!",+ "くるるっ!",+ "がぁおー!",+ "にゃーお!",+ "わん!",+ "ぱたた!",+ "プリキュア・アニマルゴーランド!"+ ],+ "purifier": [+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron",+ "CureChocolat",+ "CureParfait"+ ]+ }+ ],+ "transformations": [+ {+ "specialItems": [+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureWhip"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "ショートケーキ!",+ "元気と笑顔を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!"+ ],+ "transformers": [+ "Ichika"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureCustard"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "プリン!",+ "知性と勇気を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアカスタード!できあがり!"+ ],+ "transformers": [+ "Himari"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureGelato"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "アイス!",+ "自由と情熱を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアジェラート!できあがり!"+ ],+ "transformers": [+ "Aoi"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureMacaron"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "マカロン!",+ "美しさとトキメキを!",+ "レッツ・ラ・まぜまぜ!",+ "キュアマカロン!できあがり!"+ ],+ "transformers": [+ "Yukari"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "チョコレート!",+ "強さと愛を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアショコラ!できあがり!"+ ],+ "transformers": [+ "Akira"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "PegasusParfait"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureParfait"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "パフェ!",+ "夢と希望を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアパルフェ!できあがり!"+ ],+ "transformers": [+ "Ciel"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron",+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "ショートケーキ!",+ "元気と笑顔を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Ichika",+ "Himari",+ "Aoi",+ "Yukari",+ "Akira"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "PegasusParfait"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron",+ "CureChocolat",+ "CureParfait"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "ショートケーキ!",+ "元気と笑顔を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キュアパルフェ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Ichika",+ "Himari",+ "Aoi",+ "Yukari",+ "Akira",+ "Ciel"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureCustard",+ "CureWhip",+ "CureGelato",+ "CureMacaron",+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "プリン!",+ "知性と勇気を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Himari",+ "Ichika",+ "Aoi",+ "Yukari",+ "Akira"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureGelato",+ "CureWhip",+ "CureCustard",+ "CureMacaron",+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "アイス!",+ "自由と情熱を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Aoi",+ "Ichika",+ "Himari",+ "Yukari",+ "Akira"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureMacaron",+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "マカロン!",+ "美しさとトキメキを!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Yukari",+ "Ichika",+ "Himari",+ "Aoi",+ "Akira"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureChocolat",+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "チョコレート!",+ "強さと愛を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Akira",+ "Ichika",+ "Himari",+ "Aoi",+ "Yukari"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "PegasusParfait"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureParfait",+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron",+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "パフェ!",+ "夢と希望を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!",+ "キュアパルフェ!できあがり!",+ "キラキラ☆プリキュアアラモード!"+ ],+ "transformers": [+ "Ciel",+ "Ichika",+ "Himari",+ "Aoi",+ "Yukari",+ "Akira"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureWhip",+ "CureCustard",+ "CureGelato"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "ショートケーキ!",+ "元気と笑顔を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!"+ ],+ "transformers": [+ "Ichika",+ "Himari",+ "Aoi"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "RabbitShortcake"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "SquirrelPudding"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "LionIce"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureWhip",+ "CureCustard",+ "CureGelato",+ "CureMacaron"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "ショートケーキ!",+ "元気と笑顔を!",+ "レッツ・ラ・まぜまぜ!",+ "キュアホイップ!できあがり!",+ "キュアカスタード!できあがり!",+ "キュアジェラート!できあがり!",+ "キュアマカロン!できあがり!"+ ],+ "transformers": [+ "Ichika",+ "Himari",+ "Aoi",+ "Yukari"+ ]+ },+ {+ "specialItems": [+ {+ "a": [+ "CatMacaron"+ ],+ "i": "SweetsPact"+ },+ {+ "a": [+ "DogChocolate"+ ],+ "i": "SweetsPact"+ }+ ],+ "transformees": [+ "CureMacaron",+ "CureChocolat"+ ],+ "speech": [+ "キュアラモード・デコレーション!",+ "マカロン!",+ "美しさとトキメキを!",+ "レッツ・ラ・まぜまぜ!",+ "キュアマカロン!できあがり!",+ "キュアショコラ!できあがり!"+ ],+ "transformers": [+ "Yukari",+ "Akira"+ ]+ }+ ]+}
+ src/ACME/PreCure/Index.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE OverloadedStrings #-}++module ACME.PreCure.Index where+++import Control.Monad+ ( forM+ )+import Data.Aeson+ ( encode+ )+import Data.Aeson.Encode.Pretty+ ( encodePretty+ )+import Data.Data+ ( Data+ )+import qualified Data.ByteString.Lazy as ByteString+import Language.Haskell.TH+ ( Q+ , thisModule+ , runIO+ , tupE+ )+import Language.Haskell.TH.Syntax+ ( Module+ )++import ACME.PreCure.Textbook ()+import ACME.PreCure.Index.Lib+import ACME.PreCure.Index.Types+++writeCureIndexJson :: ()+writeCureIndexJson =+ $( do+ textbookRootMod <-+ fmap (head . filter isTextbookMod) . loadImportedModules =<< thisModule :: Q Module+ -- ^ ACME.PreCure.Textbook++ modsImportedByRoot <- loadImportedModules textbookRootMod :: Q [Module]++ textbookMods <-+ fmap (filter isTextbookMod . concat) $ mapM loadImportedModules modsImportedByRoot :: Q [Module]+ -- ^ ACME.PreCure.Textbook.*++ let collectAnnotationsFromEachSeriesModules :: Data a => Q [a]+ collectAnnotationsFromEachSeriesModules =+ fmap concat $ forM textbookMods $ \eachSeriesMod {- ACME.PreCure.Textbook.*.* -} ->+ concat <$> loadAnnotations eachSeriesMod++ gs <- collectAnnotationsFromEachSeriesModules+ ts <- collectAnnotationsFromEachSeriesModules+ is <- collectAnnotationsFromEachSeriesModules+ trs <- collectAnnotationsFromEachSeriesModules+ prs <- collectAnnotationsFromEachSeriesModules++ let index = mkIndex gs ts is trs prs+ runIO $ ByteString.writeFile "gen/cure-index.json" $ encode index+ runIO $ ByteString.writeFile "gen/pretty-cure-index.json" $ encodePretty index+ tupE []+ )
+ src/ACME/PreCure/Index/Lib.hs view
@@ -0,0 +1,69 @@+module ACME.PreCure.Index.Lib+ ( loadImportedModules+ , isTextbookMod+ , loadAnnotations+ , deriveToJsonWithoutTypeNamePrefix+ )+where+++import Data.Aeson.TH+ ( deriveToJSON+ )+import qualified Data.Aeson as Json+import Data.Aeson.Types+ ( Options(fieldLabelModifier)+ )+import Data.Char+ ( toLower+ )+import Data.Data+ ( Data+ )+import Data.List+ ( isPrefixOf+ )+import Language.Haskell.TH+ ( AnnLookup(AnnLookupModule)+ , ModuleInfo(ModuleInfo)+ , Name+ , Dec+ , Q+ , reifyAnnotations+ , reifyModule+ , nameBase+ )+import Language.Haskell.TH.Syntax+ ( Module(Module)+ , ModName(ModName)+ )+++loadImportedModules :: Module -> Q [Module]+loadImportedModules = fmap getImportedModules . reifyModule+++isTextbookMod :: Module -> Bool+isTextbookMod = ("ACME.PreCure.Textbook" `isPrefixOf`) . getModName+++loadAnnotations :: Data a => Module -> Q [a]+loadAnnotations = reifyAnnotations . AnnLookupModule+++getModName :: Module -> String+getModName (Module _ (ModName modName)) = modName+++getImportedModules :: ModuleInfo -> [Module]+getImportedModules (ModuleInfo mods) = mods+++deriveToJsonWithoutTypeNamePrefix :: Name -> Q [Dec]+deriveToJsonWithoutTypeNamePrefix name =+ deriveToJSON Json.defaultOptions { fieldLabelModifier = firstLower . drop (length $ nameBase name) } name+++firstLower :: String -> String+firstLower (x:xs) = toLower x : xs+firstLower _ = error "firstLower: Assertion failed: empty string"
+ src/ACME/PreCure/Index/Types.hs view
@@ -0,0 +1,144 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}++module ACME.PreCure.Index.Types+ ( Girl(Girl)+ , Transformee(Transformee)+ , SpecialItem(SpecialItem)+ , IdAttachments(IdAttachments)+ , Transformation(Transformation)+ , Purification(Purification)+ , Index+ , mkGirl+ , mkTransformee+ , mkSpecialItem+ , mkIA+ , mkTransformation+ , mkPurification+ , mkIndex+ ) where++import Data.Aeson+ ( ToJSON+ , toJSON+ , object+ , (.=)+ )+import Data.Data+ ( Data+ )+import Data.String+ ( IsString+ , fromString+ )++import ACME.PreCure.Index.Lib+++-- | Pair of the Girl data type name and their name+data Girl =+ Girl { girlId :: String, girlNameEn :: String, girlNameJa :: String }+ deriving (Eq, Show, Data)++$(deriveToJsonWithoutTypeNamePrefix ''Girl)++mkGirl :: String -> String -> Girl+mkGirl ne = Girl (head $ words ne) ne+++data Transformee =+ Transformee+ { transformedId :: String+ , transformedNameEn :: String+ , transformedNameJa :: String+ , transformedIntroducesHerselfAs :: String+ , transformedVariation :: String+ } deriving (Eq, Show, Data)++$(deriveToJsonWithoutTypeNamePrefix ''Transformee)++mkTransformee :: String -> String -> String -> String -> Transformee+mkTransformee ne = Transformee (concat $ words ne) ne+++data SpecialItem =+ SpecialItem+ { specialItemId :: String+ , specialItemNameEn :: String+ , specialItemNameJa :: String+ , specialItemAttachments :: [String]+ } deriving (Eq, Show, Data)++$(deriveToJsonWithoutTypeNamePrefix ''SpecialItem)++mkSpecialItem :: String -> String -> [String] -> SpecialItem+mkSpecialItem ne = SpecialItem (concat $ words ne) ne+++data IdAttachments =+ IdAttachments+ { idAttachementsI :: String+ , idAttachementsA :: [IdAttachments]+ } deriving (Eq, Show, Data)++instance ToJSON IdAttachments where+ toJSON (IdAttachments i []) = toJSON i+ toJSON (IdAttachments i a) =+ object ["i" .= toJSON i, "a" .= toJSON a]++instance IsString IdAttachments where+ fromString s = mkIA s []+++mkIA :: String -> [IdAttachments] -> IdAttachments+mkIA = IdAttachments+++data Transformation =+ Transformation+ { transformationTransformers :: [IdAttachments]+ , transformationSpecialItems :: [IdAttachments]+ , transformationTransformees :: [String]+ , transformationSpeech :: [String]+ } deriving (Eq, Show, Data)++$(deriveToJsonWithoutTypeNamePrefix ''Transformation)++mkTransformation :: [IdAttachments] -> [IdAttachments] -> [String] -> [String] -> Transformation+mkTransformation = Transformation+++data Purification =+ Purification+ { purificationPurifier :: [IdAttachments]+ , purificationSpecialItems :: [IdAttachments]+ , purificationSpeech :: [String]+ } deriving (Eq, Show, Data)++$(deriveToJsonWithoutTypeNamePrefix ''Purification)++mkPurification :: [IdAttachments] -> [IdAttachments] -> [String] -> Purification+mkPurification = Purification+++data Index =+ Index+ { indexGirls :: [Girl]+ , indexTransformees :: [Transformee]+ , indexSpecialItems :: [SpecialItem]+ , indexTransformations :: [Transformation]+ , indexPurifications :: [Purification]+ } deriving (Eq, Show)++$(deriveToJsonWithoutTypeNamePrefix ''Index)++mkIndex+ :: [Girl]+ -> [Transformee]+ -> [SpecialItem]+ -> [Transformation]+ -> [Purification]+ -> Index+mkIndex = Index
− src/ACME/PreCure/Textbook/KirakiraALaMode/Instances.hs
@@ -1,105 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}--module ACME.PreCure.Textbook.KirakiraALaMode.Instances where---import ACME.PreCure.Types.TH--import ACME.PreCure.Textbook.KirakiraALaMode.Types-import ACME.PreCure.Textbook.KirakiraALaMode.Words---transformationInstance [t| Ichika |] [t| SweetsPact RabbitShortcake |] [t| CureWhip |] [| CureWhip |] (cureALaModeDecoration : introducesHerselfAs_CureWhip)-transformationInstance [t| Himari |] [t| SweetsPact SquirrelPudding |] [t| CureCustard |] [| CureCustard |] (cureALaModeDecoration : introducesHerselfAs_CureCustard)-transformationInstance [t| Aoi |] [t| SweetsPact LionIce |] [t| CureGelato |] [| CureGelato |] (cureALaModeDecoration : introducesHerselfAs_CureGelato)-transformationInstance [t| Yukari |] [t| SweetsPact CatMacaron |] [t| CureMacaron |] [| CureMacaron |] (cureALaModeDecoration : introducesHerselfAs_CureMacaron)-transformationInstance [t| Akira |] [t| SweetsPact DogChocolate |] [t| CureChocolat |] [| CureChocolat |] (cureALaModeDecoration : introducesHerselfAs_CureChocolat)--transformationInstance- [t| (Ichika, Himari, Aoi, Yukari, Akira) |]- [t| (SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact CatMacaron, SweetsPact DogChocolate) |]- [t| (CureWhip, CureCustard, CureGelato, CureMacaron, CureChocolat) |]- [| (CureWhip, CureCustard, CureGelato, CureMacaron, CureChocolat) |]- (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureWhip)--transformationInstance- [t| (Himari, Ichika, Aoi, Yukari, Akira) |]- [t| (SweetsPact SquirrelPudding, SweetsPact RabbitShortcake, SweetsPact LionIce, SweetsPact CatMacaron, SweetsPact DogChocolate) |]- [t| (CureCustard, CureWhip, CureGelato, CureMacaron, CureChocolat) |]- [| (CureCustard, CureWhip, CureGelato, CureMacaron, CureChocolat) |]- (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureCustard)--transformationInstance- [t| (Aoi, Ichika, Himari, Yukari, Akira) |]- [t| (SweetsPact LionIce, SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact CatMacaron, SweetsPact DogChocolate) |]- [t| (CureGelato, CureWhip, CureCustard, CureMacaron, CureChocolat) |]- [| (CureGelato, CureWhip, CureCustard, CureMacaron, CureChocolat) |]- (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureGelato)--transformationInstance- [t| (Yukari, Ichika, Himari, Aoi, Akira) |]- [t| (SweetsPact CatMacaron, SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact DogChocolate) |]- [t| (CureMacaron, CureWhip, CureCustard, CureGelato, CureChocolat) |]- [| (CureMacaron, CureWhip, CureCustard, CureGelato, CureChocolat) |]- (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureMacaron)--transformationInstance- [t| (Akira, Ichika, Himari, Aoi, Yukari) |]- [t| (SweetsPact DogChocolate, SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact CatMacaron) |]- [t| (CureChocolat, CureWhip, CureCustard, CureGelato, CureMacaron) |]- [| (CureChocolat, CureWhip, CureCustard, CureGelato, CureMacaron) |]- (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureChocolat)--transformationInstance- [t| (Ichika, Himari, Aoi) |]- [t| (SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce) |]- [t| (CureWhip, CureCustard, CureGelato) |]- [| (CureWhip, CureCustard, CureGelato) |]- ( kirakiraALaModeTransformationSpeechOf- [ introducesHerselfAs_CureWhip- , introducesHerselfAs_CureCustard- , introducesHerselfAs_CureGelato- ]- )--transformationInstance- [t| (Ichika, Himari, Aoi, Yukari) |]- [t| (SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact CatMacaron) |]- [t| (CureWhip, CureCustard, CureGelato, CureMacaron) |]- [| (CureWhip, CureCustard, CureGelato, CureMacaron) |]- ( kirakiraALaModeTransformationSpeechOf- [ introducesHerselfAs_CureWhip- , introducesHerselfAs_CureCustard- , introducesHerselfAs_CureGelato- , introducesHerselfAs_CureMacaron- ]- )--transformationInstance- [t| (Yukari, Akira) |]- [t| (SweetsPact CatMacaron, SweetsPact DogChocolate) |]- [t| (CureMacaron, CureChocolat) |]- [| (CureMacaron, CureChocolat) |]- ( kirakiraALaModeTransformationSpeechOf- [ introducesHerselfAs_CureMacaron- , introducesHerselfAs_CureChocolat- ]- )--purificationInstance [t| CureWhip |] [t| CandyRod |] ["キラキラキラルン!", "ホイップ・デコレーション!"]-purificationInstance [t| CureCustard |] [t| CandyRod |] ["キラキラキラルン!", "カスタード・イリュージョン!"]-purificationInstance [t| CureGelato |] [t| CandyRod |] ["キラキラキラルン!", "ジェラート・シェイク!"]-purificationInstance [t| CureMacaron |] [t| CandyRod |] ["キラキラキラルン!", "マカロン・ジュリエンヌ!", "にゃーお♥"]-purificationInstance [t| CureChocolat |] [t| CandyRod |] ["キラキラキラルン!", "ショコラ・アロマーゼ!"]--purificationInstance- [t| (CureWhip, CureCustard, CureGelato, CureMacaron, CureChocolat) |]- [t| CandyRod |]- [ "キャンディーロッド!"- , "キラキラキラル・フルチャージ!"- , "スイー・ツー・ワンダフル・アラモード!"- ]
+ src/ACME/PreCure/Textbook/KirakiraALaMode/Profiles.hs view
@@ -0,0 +1,203 @@+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}+{-# LANGUAGE OverloadedStrings #-}++module ACME.PreCure.Textbook.KirakiraALaMode.Profiles where++import ACME.PreCure.Index.Types+++girls :: [Girl]+girls =+ [ mkGirl "Ichika Usami" "宇佐美 いちか"+ , mkGirl "Himari Arisugawa" "有栖川 ひまり"+ , mkGirl "Aoi Tategami" "立神 あおい"+ , mkGirl "Yukari Kotozume" "琴爪 ゆかり"+ , mkGirl "Akira Kenjo" "剣城 あきら"+ , mkGirl "Ciel Kirahoshi" "キラ星 シエル" -- TODO: Synonym for Kirarin+ ]+++transformees :: [Transformee]+transformees =+ [ mkTransformee "Cure Whip" "キュアホイップ" (concat introducesHerselfAs_CureWhip) ""+ , mkTransformee "Cure Custard" "キュアカスタード" (concat introducesHerselfAs_CureCustard) ""+ , mkTransformee "Cure Gelato" "キュアジェラート" (concat introducesHerselfAs_CureGelato) ""+ , mkTransformee "Cure Macaron" "キュアマカロン" (concat introducesHerselfAs_CureMacaron) ""+ , mkTransformee "Cure Chocolat" "キュアショコラ" (concat introducesHerselfAs_CureChocolat) ""+ , mkTransformee "Cure Parfait" "キュアパルフェ" (concat introducesHerselfAs_CureParfait) ""+ ]+++specialItems :: [SpecialItem]+specialItems =+ [ mkSpecialItem "Sweets Pact" "スイーツパクト" ["Animal Sweets"]+ , mkSpecialItem "Rabbit Shortcake" "うさぎショートケーキ" []+ , mkSpecialItem "Squirrel Pudding" "りすプリン" []+ , mkSpecialItem "Lion Ice" "らいおんアイス" []+ , mkSpecialItem "Cat Macaron" "ねこマカロン" []+ , mkSpecialItem "Dog Chocolate" "いぬチョコレート" []+ , mkSpecialItem "Pegasus Parfait" "ペガサスパフェ" []+ , mkSpecialItem "Candy Rod" "キャンディロッド" []+ , mkSpecialItem "Rainbow Ribbon" "レインボーリボン" []+ , mkSpecialItem "Kirakiraru Creamer" "キラキラルクリーマー" ["Crystal Animal"]+ , mkSpecialItem "Crystal Animal Rabbit" "クリスタルアニマルうさぎ" []+ , mkSpecialItem "Crystal Animal Squirrel" "クリスタルアニマルりす" []+ , mkSpecialItem "Crystal Animal Lion" "クリスタルアニマルらいおん" []+ , mkSpecialItem "Crystal Animal Cat" "クリスタルアニマルねこ" []+ , mkSpecialItem "Crystal Animal Dog" "クリスタルアニマルいぬ" []+ , mkSpecialItem "Crystal Animal Pegasus" "クリスタルアニマルペガサス" []+ ]+++transformations :: [Transformation]+transformations =+ [ mkTransformation ["Ichika"] [mkIA "SweetsPact" ["RabbitShortcake"]] ["CureWhip"] (cureALaModeDecoration : introducesHerselfAs_CureWhip)+ , mkTransformation ["Himari"] [mkIA "SweetsPact" ["SquirrelPudding"]] ["CureCustard"] (cureALaModeDecoration : introducesHerselfAs_CureCustard)+ , mkTransformation ["Aoi"] [mkIA "SweetsPact" ["LionIce"]] ["CureGelato"] (cureALaModeDecoration : introducesHerselfAs_CureGelato)+ , mkTransformation ["Yukari"] [mkIA "SweetsPact" ["CatMacaron"]] ["CureMacaron"] (cureALaModeDecoration : introducesHerselfAs_CureMacaron)+ , mkTransformation ["Akira"] [mkIA "SweetsPact" ["DogChocolate"]] ["CureChocolat"] (cureALaModeDecoration : introducesHerselfAs_CureChocolat)+ , mkTransformation ["Ciel"] [mkIA "SweetsPact" ["PegasusParfait"]] ["CureParfait"] (cureALaModeDecoration : introducesHerselfAs_CureParfait)+ , mkTransformation+ ["Ichika", "Himari", "Aoi", "Yukari", "Akira"]+ [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]+ ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat"]+ (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureWhip)+ , mkTransformation+ ["Ichika", "Himari", "Aoi", "Yukari", "Akira", "Ciel"]+ [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"], mkIA "SweetsPact" ["PegasusParfait"]]+ ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat", "CureParfait"]+ (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureWhip)+ , mkTransformation+ ["Himari", "Ichika", "Aoi", "Yukari", "Akira"]+ [mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]+ ["CureCustard", "CureWhip", "CureGelato", "CureMacaron", "CureChocolat"]+ (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureCustard)+ , mkTransformation+ ["Aoi", "Ichika", "Himari", "Yukari", "Akira"]+ [mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]+ ["CureGelato", "CureWhip", "CureCustard", "CureMacaron", "CureChocolat"]+ (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureGelato)+ , mkTransformation+ ["Yukari", "Ichika", "Himari", "Aoi", "Akira"]+ [mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["DogChocolate"]]+ ["CureMacaron", "CureWhip", "CureCustard", "CureGelato", "CureChocolat"]+ (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureMacaron)+ , mkTransformation+ ["Akira", "Ichika", "Himari", "Aoi", "Yukari"]+ [mkIA "SweetsPact" ["DogChocolate"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"]]+ ["CureChocolat", "CureWhip", "CureCustard", "CureGelato", "CureMacaron"]+ (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureChocolat)+ , mkTransformation+ ["Ciel", "Ichika", "Himari", "Aoi", "Yukari", "Akira"]+ [mkIA "SweetsPact" ["PegasusParfait"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]+ ["CureParfait", "CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat"]+ (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureParfait)+ , mkTransformation+ ["Ichika", "Himari", "Aoi"]+ [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"]]+ ["CureWhip", "CureCustard", "CureGelato"]+ ( kirakiraALaModeTransformationSpeechOf+ [ introducesHerselfAs_CureWhip+ , introducesHerselfAs_CureCustard+ , introducesHerselfAs_CureGelato+ ]+ )+ , mkTransformation+ ["Ichika", "Himari", "Aoi", "Yukari"]+ [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"]]+ ["CureWhip", "CureCustard", "CureGelato", "CureMacaron"]+ ( kirakiraALaModeTransformationSpeechOf+ [ introducesHerselfAs_CureWhip+ , introducesHerselfAs_CureCustard+ , introducesHerselfAs_CureGelato+ , introducesHerselfAs_CureMacaron+ ]+ )+ , mkTransformation+ ["Yukari", "Akira"]+ [mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]+ ["CureMacaron", "CureChocolat"]+ ( kirakiraALaModeTransformationSpeechOf+ [ introducesHerselfAs_CureMacaron+ , introducesHerselfAs_CureChocolat+ ]+ )+ ]+++purifications :: [Purification]+purifications =+ [ mkPurification ["CureWhip"] ["CandyRod"] ["キラキラキラルン!", "ホイップ・デコレーション!"]+ , mkPurification ["CureCustard"] ["CandyRod"] ["キラキラキラルン!", "カスタード・イリュージョン!"]+ , mkPurification ["CureGelato"] ["CandyRod"] ["キラキラキラルン!", "ジェラート・シェイク!"]+ , mkPurification ["CureMacaron"] ["CandyRod"] ["キラキラキラルン!", "マカロン・ジュリエンヌ!", "にゃーお♥"]+ , mkPurification ["CureChocolat"] ["CandyRod"] ["キラキラキラルン!", "ショコラ・アロマーゼ!"]+ -- TODO: Purification Instance of CureParfait and RainbowRibbon overlap!+ -- , mkPurification ["CureParfait"] ["RainbowRibbon"] ["キラキラキラリン!", "パルフェ・エトワール!"]+ , mkPurification ["CureParfait"] ["RainbowRibbon"] ["レインボーリボン!", "行くよ!アン・ドゥ・トレビアン!", "キラクル・レインボー!", "ボナペティ!"]+ , mkPurification+ ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat"]+ ["CandyRod"]+ ["キャンディーロッド!", "キラキラキラル・フルチャージ!", "スイー・ツー・ワンダフル・アラモード!"]+ , mkPurification+ ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat", "CureParfait"]+ [ mkIA "KirakiraruCreamer" ["CrystalAnimalRabbit"]+ , mkIA "KirakiraruCreamer" ["CrystalAnimalSquirrel"]+ , mkIA "KirakiraruCreamer" ["CrystalAnimalLion"]+ , mkIA "KirakiraruCreamer" ["CrystalAnimalCat"]+ , mkIA "KirakiraruCreamer" ["CrystalAnimalDog"]+ , mkIA "KirakiraruCreamer" ["CrystalAnimalPegasus"]+ ]+ [ "キラキラルクリーマー!"+ , "キラッと輝け!クリスタルアニマル!"+ , "ぴょーん!"+ , "くるるっ!"+ , "がぁおー!"+ , "にゃーお!"+ , "わん!"+ , "ぱたた!"+ , "プリキュア・アニマルゴーランド!"+ ]+ ]+++groupName_KirakiraALaMode = "キラキラ☆プリキュアアラモード"++cureALaModeDecoration = "キュアラモード・デコレーション!"++introducesHerselfAs_CureWhip = ["ショートケーキ!", "元気と笑顔を!", "レッツ・ラ・まぜまぜ!", "キュアホイップ!できあがり!"]+introducesHerselfAs_CureCustard = ["プリン!", "知性と勇気を!", "レッツ・ラ・まぜまぜ!", "キュアカスタード!できあがり!"]+introducesHerselfAs_CureGelato = ["アイス!", "自由と情熱を!", "レッツ・ラ・まぜまぜ!", "キュアジェラート!できあがり!"]+introducesHerselfAs_CureMacaron = ["マカロン!", "美しさとトキメキを!", "レッツ・ラ・まぜまぜ!", "キュアマカロン!できあがり!"]+introducesHerselfAs_CureChocolat = ["チョコレート!", "強さと愛を!", "レッツ・ラ・まぜまぜ!", "キュアショコラ!できあがり!"]+introducesHerselfAs_CureParfait = ["パフェ!", "夢と希望を!", "レッツ・ラ・まぜまぜ!", "キュアパルフェ!できあがり!"]++kirakiraALaModeTransformationSpeechOf :: [[String]] -> [String]+kirakiraALaModeTransformationSpeechOf [] = error "No transforamation speech given!"+kirakiraALaModeTransformationSpeechOf al@(first:_) =+ cureALaModeDecoration : init first ++ map last al++kirakiraALaModeTransformationSpeechFeaturing' :: [String] -> [String]+kirakiraALaModeTransformationSpeechFeaturing' first =+ cureALaModeDecoration : init first ++ allDekiagari ++ [groupName_KirakiraALaMode ++ "!"]+ where+ allDekiagari = map last+ [ introducesHerselfAs_CureWhip+ , introducesHerselfAs_CureCustard+ , introducesHerselfAs_CureGelato+ , introducesHerselfAs_CureMacaron+ , introducesHerselfAs_CureChocolat+ ]++kirakiraALaModeTransformationSpeechFeaturing :: [String] -> [String]+kirakiraALaModeTransformationSpeechFeaturing first =+ cureALaModeDecoration : init first ++ allDekiagari ++ [groupName_KirakiraALaMode ++ "!"]+ where+ allDekiagari = map last+ [ introducesHerselfAs_CureWhip+ , introducesHerselfAs_CureCustard+ , introducesHerselfAs_CureGelato+ , introducesHerselfAs_CureMacaron+ , introducesHerselfAs_CureChocolat+ , introducesHerselfAs_CureParfait+ ]
src/ACME/PreCure/Textbook/KirakiraALaMode/Types.hs view
@@ -1,30 +1,26 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -fno-warn-orphans #-} module ACME.PreCure.Textbook.KirakiraALaMode.Types where import ACME.PreCure.Types.TH -import ACME.PreCure.Textbook.KirakiraALaMode.Words-+import ACME.PreCure.Textbook.KirakiraALaMode.Profiles -defineGirl "Ichika" "宇佐美 いちか"-defineGirl "Himari" "有栖川 ひまり"-defineGirl "Aoi" "立神 あおい"-defineGirl "Yukari" "琴爪 ゆかり"-defineGirl "Akira" "剣城 あきら"+{-# ANN module girls #-}+$(declareGirls girls) -defineTransformedDefault "CureWhip" "キュアホイップ" $ concat introducesHerselfAs_CureWhip-defineTransformedDefault "CureCustard" "キュアカスタード" $ concat introducesHerselfAs_CureCustard-defineTransformedDefault "CureGelato" "キュアジェラート" $ concat introducesHerselfAs_CureGelato-defineTransformedDefault "CureMacaron" "キュアマカロン" $ concat introducesHerselfAs_CureMacaron-defineTransformedDefault "CureChocolat" "キュアショコラ" $ concat introducesHerselfAs_CureChocolat+{-# ANN module transformees #-}+$(declareTransformees transformees) -data SweetsPact s = SweetsPact s+{-# ANN module specialItems #-}+$(declareSpecialItems specialItems) -define "RabbitShortcake"-define "SquirrelPudding"-define "LionIce"-define "CatMacaron"-define "DogChocolate"+{-# ANN module transformations #-}+$(declareTransformations transformations) -define "CandyRod"+{-# ANN module purifications #-}+$(declarePurifications purifications)
− src/ACME/PreCure/Textbook/KirakiraALaMode/Words.hs
@@ -1,30 +0,0 @@-{-# OPTIONS_GHC -fno-warn-missing-signatures #-}--module ACME.PreCure.Textbook.KirakiraALaMode.Words where--groupName_KirakiraALaMode = "キラキラ☆プリキュアアラモード"--cureALaModeDecoration = "キュアラモード・デコレーション!"--introducesHerselfAs_CureWhip = ["ショートケーキ!", "元気と笑顔を!", "レッツ・ラ・まぜまぜ!", "キュアホイップ!できあがり!"]-introducesHerselfAs_CureCustard = ["プリン!", "知性と勇気を!", "レッツ・ラ・まぜまぜ!", "キュアカスタード!できあがり!"]-introducesHerselfAs_CureGelato = ["アイス!", "自由と情熱を!", "レッツ・ラ・まぜまぜ!", "キュアジェラート!できあがり!"]-introducesHerselfAs_CureMacaron = ["マカロン!", "美しさとトキメキを!", "レッツ・ラ・まぜまぜ!", "キュアマカロン!できあがり!"]-introducesHerselfAs_CureChocolat = ["チョコレート!", "強さと愛を!", "レッツ・ラ・まぜまぜ!", "キュアショコラ!できあがり!"]--kirakiraALaModeTransformationSpeechOf :: [[String]] -> [String]-kirakiraALaModeTransformationSpeechOf [] = error "No transforamation speech given!"-kirakiraALaModeTransformationSpeechOf al@(first:_) =- cureALaModeDecoration : init first ++ map last al--kirakiraALaModeTransformationSpeechFeaturing :: [String] -> [String]-kirakiraALaModeTransformationSpeechFeaturing first =- cureALaModeDecoration : init first ++ allDekiagari ++ [groupName_KirakiraALaMode ++ "!"]- where- allDekiagari = map last- [ introducesHerselfAs_CureWhip- , introducesHerselfAs_CureCustard- , introducesHerselfAs_CureGelato- , introducesHerselfAs_CureMacaron- , introducesHerselfAs_CureChocolat- ]
src/ACME/PreCure/Types/TH.hs view
@@ -1,10 +1,11 @@ {-# LANGUAGE TemplateHaskell #-} module ACME.PreCure.Types.TH- ( define- , defineGirl- , defineTransformed- , defineTransformedDefault+ ( declareGirls+ , declareTransformees+ , declareSpecialItems+ , declareTransformations+ , declarePurifications , girlInstance , transformedInstance@@ -19,55 +20,108 @@ import ACME.PreCure.Types+import qualified ACME.PreCure.Index.Types as Index +import Data.Char+ ( toLower+ ) import Language.Haskell.TH ( Name- , conT- , mkName- )-import Language.Haskell.TH.Compat.Data- ( dataD'- )-import Language.Haskell.TH.Lib- ( DecsQ , DecQ+ , DecsQ , ExpQ , TypeQ+ , Type(VarT, ConT, TupleT)+ , conE+ , conT , cxt , listE+ , mkName , normalC , stringE+ , tupE )+import Language.Haskell.TH.Lib+ ( StrictTypeQ+ , plainTV+ )+import Language.Haskell.TH.Compat.Data+ ( dataD'+ )+import Language.Haskell.TH.Compat.Strict+ ( isStrict+ )+import TH.Utilities+ ( appsT+ ) -singletonDataD :: Name -> DecQ-singletonDataD name =- dataD' (cxt []) name [] [normalC name []] [''Show, ''Eq] +-- Add type argument names+singletonDataD :: Name -> [Name] -> DecQ+singletonDataD name tyVarNames =+ dataD' (cxt []) name (map plainTV tyVarNames) [normalC name $ map toTypeVar tyVarNames] [''Show, ''Eq] -define :: String -> DecsQ-define string = (:[]) <$> singletonDataD (mkName string) +defineWithTypeVars :: String -> [String] -> DecsQ+defineWithTypeVars string strings =+ (: []) <$> singletonDataD (mkName string) (map mkName strings) ++toTypeVar :: Name -> StrictTypeQ+toTypeVar name = return (isStrict, VarT name)++ defineWith :: Name -> DecsQ -> DecsQ-defineWith name decsq = (:) <$> singletonDataD name <*> decsq+defineWith name decsq = (:) <$> singletonDataD name [] <*> decsq -defineGirl :: String -> String -> DecsQ-defineGirl string humanN = do- let name = mkName string- defineWith name $ girlInstance (conT name) humanN+-- | Declare data types with their Girl instances from the type names and girl names.+declareGirls :: [Index.Girl] -> DecsQ+declareGirls = fmap concat . mapM d+ where+ d (Index.Girl n _e j) = do+ let name = mkName n+ defineWith name $ girlInstance (conT name) j -defineTransformed :: String -> String -> String -> String -> DecsQ-defineTransformed string cureN intro vari = do- let name = mkName string- defineWith name $ transformedInstance (conT name) cureN intro vari+declareTransformees :: [Index.Transformee] -> DecsQ+declareTransformees = fmap concat . mapM d+ where+ d (Index.Transformee n _e j intro vari) = do+ let name = mkName n+ defineWith name $ transformedInstance (conT name) j intro vari -defineTransformedDefault :: String -> String -> String -> DecsQ-defineTransformedDefault string cureN intro = defineTransformed string cureN intro ""+declareSpecialItems :: [Index.SpecialItem] -> DecsQ+declareSpecialItems = fmap concat . mapM d+ where+ d (Index.SpecialItem n _e _j as) = do+ let aNames = map (firstLower . concat . words) as+ defineWithTypeVars n aNames +declareTransformations :: [Index.Transformation] -> DecsQ+declareTransformations = fmap concat . mapM d+ where+ d (Index.Transformation tas ias ds s) = do+ transformationInstance+ (tupleTFromIdAttachments tas)+ (tupleTFromIdAttachments ias)+ (tupleT $ map mkName ds)+ (tupleE $ map mkName ds)+ s+++declarePurifications :: [Index.Purification] -> DecsQ+declarePurifications = fmap concat . mapM d+ where+ d (Index.Purification pas ias s) = do+ purificationInstance+ (tupleTFromIdAttachments pas)+ (tupleTFromIdAttachments ias)+ s++ girlInstance :: TypeQ -> String -> DecsQ girlInstance typeq humanN = [d|@@ -136,3 +190,27 @@ instance NonItemPurification $(p') where nonItemPurificationSpeech _ = $(listE $ map stringE speech) |]+++tupleTFromIdAttachments :: [Index.IdAttachments] -> TypeQ+tupleTFromIdAttachments = tupleTBy toAppT+ where+ toAppT :: Index.IdAttachments -> Type+ toAppT (Index.IdAttachments i ias) = appsT (ConT $ mkName i) $ map toAppT ias+++tupleT :: [Name] -> TypeQ+tupleT ns = tupleTBy ConT ns+++tupleTBy :: (a -> Type) -> [a] -> TypeQ+tupleTBy f ns = return $ appsT (TupleT (length ns)) (map f ns)+++tupleE :: [Name] -> ExpQ+tupleE = tupE . map conE+++firstLower :: String -> String+firstLower (x:xs) = toLower x : xs+firstLower _ = error "firstLower: Assertion failed: empty string"
typesafe-precure.cabal view
@@ -1,17 +1,19 @@-name: typesafe-precure-version: 0.3.1.1-synopsis: Type-safe transformations and purifications of PreCures (Japanese Battle Heroine)-description: See README.md for details.-homepage: https://github.com/igrep/typesafe-precure#readme-license: BSD3-license-file: LICENSE-author: Yuji Yamamoto-maintainer: whosekiteneverfly@gmail.com-copyright: 2017 Yuji Yamamoto-category: ACME-build-type: Simple-extra-source-files: README.md CHANGELOG.md-cabal-version: >=1.10+name: typesafe-precure+version: 0.4.0.0+synopsis: Type-safe transformations and purifications of PreCures (Japanese Battle Heroine)+description: See README.md for details.+homepage: https://github.com/igrep/typesafe-precure#readme+license: BSD3+license-file: LICENSE+author: Yuji Yamamoto+maintainer: whosekiteneverfly@gmail.com+copyright: 2017 Yuji Yamamoto+category: ACME+build-type: Simple+extra-source-files: README.md+ CHANGELOG.md+ gen/*.json+cabal-version: >=1.10 library hs-source-dirs: src@@ -77,19 +79,28 @@ , ACME.PreCure.Textbook.KirakiraALaMode + , ACME.PreCure.Index+ , ACME.PreCure.Index.Types+ , ACME.PreCure.Types , ACME.PreCure.Monad other-modules: ACME.PreCure.Types.TH- , ACME.PreCure.Textbook.KirakiraALaMode.Instances+ , ACME.PreCure.Index.Lib , ACME.PreCure.Textbook.KirakiraALaMode.Types- , ACME.PreCure.Textbook.KirakiraALaMode.Words+ , ACME.PreCure.Textbook.KirakiraALaMode.Profiles build-depends: base >= 4.7 && < 5 -- TODO: specify version+ , aeson+ , aeson-pretty , autoexporter+ , bytestring , monad-skeleton , dlist , template-haskell+ , text , th-data-compat+ , th-strict-compat+ , th-utilities default-language: Haskell2010 test-suite typesafe-precure-test