@@ -8,7 +8,7 @@
88
99module Rel8.Kind.Labels
1010 ( Labels
11− , SLabels( SLabel, SLabels )
11+ , SLabels( SNil, SCons )
1212 , KnownLabels( labelsSing )
1313 , renderLabels
1414 )
@@ -16,7 +16,8 @@ where
1616
1717-- base
1818import Data.Kind ( Constraint, Type )
19−import Data.List.NonEmpty ( NonEmpty( (:|) ), (<|) )
19+import Data.List.NonEmpty ( NonEmpty, nonEmpty )
20+import Data.Maybe ( fromMaybe )
2021import Data.Proxy ( Proxy( Proxy ) )
2122import GHC.TypeLits ( KnownSymbol, Symbol, symbolVal )
2223import Prelude
@@ -28,8 +29,8 @@ type Labels = [Symbol]
2829
2930type SLabels :: Labels -> Type
3031data SLabels labels where
31− SLabel :: KnownSymbol label => Proxy label -> SLabels '[label]
32− SLabels :: KnownSymbol label => Proxy label -> SLabels labels -> SLabels (label ': labels)
32+ SNil :: SLabels '[]
33+ SCons :: KnownSymbol label => Proxy label -> SLabels labels -> SLabels (label ': labels)
3334
3435
3536type KnownLabels :: Labels -> Constraint
@@ -37,25 +38,20 @@ class KnownLabels labels where
3738 labelsSing :: SLabels labels
3839
3940
40−instance KnownSymbol label => KnownLabels (label ': '[]) where
41− labelsSing = SLabel Proxy
41+instance KnownLabels '[] where
42+ labelsSing = SNil
4243
4344
44−instance (KnownSymbol label, KnownLabels (label_ ': labels)) =>
45− KnownLabels (label ': (label_ ': labels))
45+instance (KnownSymbol label, KnownLabels labels) =>
46+ KnownLabels (label ': labels)
4647 where
47− labelsSing = SLabels Proxy labelsSing
48+ labelsSing = SCons Proxy labelsSing
4849
4950
5051renderLabels :: SLabels labels -> NonEmpty String
51−renderLabels = cleanup . go
52+renderLabels = fromMaybe (pure "anon") . nonEmpty . go
5253 where
53− go :: SLabels labels -> NonEmpty String
54+ go :: SLabels labels -> [String]
5455 go = \case
55− SLabel label -> pure (symbolVal label)
56− SLabels label labels -> symbolVal label <| go labels
57−
58− cleanup ("" :| []) = "anon" :| []
59− cleanup (a :| []) = a :| []
60− cleanup (a :| [""]) = a :| []
61− cleanup (a :| (b : c)) = a <| cleanup (b :| c)
56+ SNil -> []
57+ SCons label labels -> symbolVal label : go labels