|
| 1 | +module Data.Generic.Rep.Show |
| 2 | + ( class GenericShow |
| 3 | + , genericShow' |
| 4 | + , genericShow |
| 5 | + , class GenericShowArgs |
| 6 | + , genericShowArgs |
| 7 | + , class GenericShowFields |
| 8 | + , genericShowFields |
| 9 | + ) where |
| 10 | + |
| 11 | +import Prelude (class Show, show, (<>)) |
| 12 | +import Data.Foldable (intercalate) |
| 13 | +import Data.Generic.Rep |
| 14 | +import Data.Symbol (class IsSymbol, SProxy(..), reflectSymbol) |
| 15 | + |
| 16 | +class GenericShow a where |
| 17 | + genericShow' :: a -> String |
| 18 | + |
| 19 | +class GenericShowArgs a where |
| 20 | + genericShowArgs :: a -> Array String |
| 21 | + |
| 22 | +class GenericShowFields a where |
| 23 | + genericShowFields :: a -> Array String |
| 24 | + |
| 25 | +instance genericShowNoConstructors :: GenericShow NoConstructors where |
| 26 | + genericShow' a = genericShow' a |
| 27 | + |
| 28 | +instance genericShowArgsNoArguments :: GenericShowArgs NoArguments where |
| 29 | + genericShowArgs _ = [] |
| 30 | + |
| 31 | +instance genericShowSum :: (GenericShow a, GenericShow b) => GenericShow (Sum a b) where |
| 32 | + genericShow' (Inl a) = genericShow' a |
| 33 | + genericShow' (Inr b) = genericShow' b |
| 34 | + |
| 35 | +instance genericShowArgsProduct |
| 36 | + :: (GenericShowArgs a, GenericShowArgs b) |
| 37 | + => GenericShowArgs (Product a b) where |
| 38 | + genericShowArgs (Product a b) = genericShowArgs a <> genericShowArgs b |
| 39 | + |
| 40 | +instance genericShowFieldsProduct |
| 41 | + :: (GenericShowFields a, GenericShowFields b) |
| 42 | + => GenericShowFields (Product a b) where |
| 43 | + genericShowFields (Product a b) = genericShowFields a <> genericShowFields b |
| 44 | + |
| 45 | +instance genericShowConstructor |
| 46 | + :: (GenericShowArgs a, IsSymbol name) |
| 47 | + => GenericShow (Constructor name a) where |
| 48 | + genericShow' (Constructor a) = |
| 49 | + case genericShowArgs a of |
| 50 | + [] -> ctor |
| 51 | + args -> "(" <> intercalate " " ([ctor] <> args) <> ")" |
| 52 | + where |
| 53 | + ctor :: String |
| 54 | + ctor = reflectSymbol (SProxy :: SProxy name) |
| 55 | + |
| 56 | +instance genericShowArgsArgument :: Show a => GenericShowArgs (Argument a) where |
| 57 | + genericShowArgs (Argument a) = [show a] |
| 58 | + |
| 59 | +instance genericShowArgsRec :: GenericShowFields a => GenericShowArgs (Rec a) where |
| 60 | + genericShowArgs (Rec a) = ["{ " <> intercalate ", " (genericShowFields a) <> " }"] |
| 61 | + |
| 62 | +instance genericShowFieldsField |
| 63 | + :: (Show a, IsSymbol name) |
| 64 | + => GenericShowFields (Field name a) where |
| 65 | + genericShowFields (Field a) = |
| 66 | + [reflectSymbol (SProxy :: SProxy name) <> ": " <> show a] |
| 67 | + |
| 68 | +-- | A `Generic` implementation of the `show` member from the `Show` type class. |
| 69 | +genericShow :: forall a rep. (Generic a rep, GenericShow rep) => a -> String |
| 70 | +genericShow x = genericShow' (from x) |
0 commit comments