From 9a0b116cd7a78590cd46bb17bbd542d93de2acef Mon Sep 17 00:00:00 2001 From: defanor Date: Sat, 16 Dec 2017 18:39:15 +0300 Subject: Add the 'handleRecCon' function Abstract the code with it. --- Coalpit.hs | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) (limited to 'Coalpit.hs') diff --git a/Coalpit.hs b/Coalpit.hs index b4b7b2f..42fb1ae 100644 --- a/Coalpit.hs +++ b/Coalpit.hs @@ -171,6 +171,21 @@ instance (GCoalpit a, GCoalpit b) => GCoalpit (a :*: b) where -- Sums +-- | Handles recursive constructors. +handleRecCon :: GCoalpit a + => String + -- ^ Constructor name + -> Options + -> [String] + -> Proxy (a p) + -> String +handleRecCon nameA opt path (Proxy :: Proxy (a p)) = conNameMod opt nameA + ++ if nameA `elem` path + then "..." + else case gArgHelper opt (nameA : path) (Proxy :: Proxy (a p)) of + "" -> "" + s -> ' ' : s + instance (Constructor conA, GCoalpit a, GCoalpit (b :+: c)) => GCoalpit ((b :+: c) :+: C1 conA a) where gArgParser opt = @@ -185,14 +200,9 @@ instance (Constructor conA, GCoalpit a, GCoalpit (b :+: c)) => in concat [ "(" , gArgHelper opt path (Proxy :: Proxy ((b :+: c) p)) , " | " - , conNameMod opt nameA - , if nameA `elem` path - then "..." - else spaceNonEmpty $ - gArgHelper opt (nameA : path) (Proxy :: Proxy (a p)) + , handleRecCon nameA opt path (Proxy :: Proxy (a p)) , ")"] - instance (Constructor conA, GCoalpit a, GCoalpit (b :+: c)) => GCoalpit (C1 conA a :+: (b :+: c)) where gArgParser opt = @@ -205,11 +215,7 @@ instance (Constructor conA, GCoalpit a, GCoalpit (b :+: c)) => gArgHelper opt path (Proxy :: Proxy ((C1 conA a :+: (b :+: c)) p)) = let nameA = conName (undefined :: C1 conA a p) in concat [ "(" - , conNameMod opt nameA - , if nameA `elem` path - then "..." - else spaceNonEmpty $ - gArgHelper opt (nameA : path) (Proxy :: Proxy (a p)) + , handleRecCon nameA opt path (Proxy :: Proxy (a p)) , " | " , gArgHelper opt path (Proxy :: Proxy ((b :+: c) p)) , ")"] @@ -230,23 +236,11 @@ instance (Constructor conA, Constructor conB, GCoalpit a, GCoalpit b) => let nameA = conName (undefined :: C1 conA a p) nameB = conName (undefined :: C1 conB b p) in concat [ "(" - , conNameMod opt nameA - , if nameA `elem` path - then "..." - else spaceNonEmpty $ - gArgHelper opt (nameA : path) (Proxy :: Proxy (a p)) + , handleRecCon nameA opt path (Proxy :: Proxy (a p)) , " | " - , conNameMod opt nameB - , if nameB `elem` path - then "..." - else spaceNonEmpty $ - gArgHelper opt (nameB : path) (Proxy :: Proxy (b p)) + , handleRecCon nameB opt path (Proxy :: Proxy (b p)) , ")"] -spaceNonEmpty :: String -> String -spaceNonEmpty "" = "" -spaceNonEmpty s = ' ' : s - -- Record Selectors -- cgit v1.2.3