@@ -2,12 +2,41 @@ module Data.Schematic.Path where
22
33import Data.Foldable as F
44import Data.Monoid
5+import Data.Schematic.Schema
56import Data.Singletons
67import Data.Singletons.Prelude
78import Data.Singletons.TypeLits
89import Data.Text as T
910
1011
12+-- Schema level path
13+
14+data Path
15+ = PKey Symbol -- traverse into the object by key
16+ | PTraverse -- traverse into the array
17+
18+data instance Sing (p :: Path) where
19+ SPKey :: Sing s -> Sing ('PKey s)
20+ SPTraverse :: Sing 'PTraverse
21+
22+instance KnownSymbol s => SingI ('PKey s) where
23+ sing = SPKey sing
24+
25+instance SingI 'PTraverse where
26+ sing = SPTraverse
27+
28+type family TraverseStep (p :: Path) (s :: Schema) :: Schema where
29+ TraverseStep ('PKey fn) ('SchemaObject ( '(fn, s) ': tl )) = s
30+ TraverseStep ('PKey fn) ('SchemaObject ( '(x, s) ': tl )) =
31+ TraverseStep ('PKey fn) ('SchemaObject tl)
32+ TraverseStep 'PTraverse ('SchemaArray cs s) = s
33+
34+type family TraversePath (ps :: [Path]) (s :: Schema) :: Schema where
35+ TraversePath '[] s = s
36+ TraversePath (p ': ps) s = TraversePath ps (TraverseStep p s)
37+
38+-- Data level path
39+
1140data PathSegment = Key Symbol | Ix Nat
1241
1342data instance Sing (jp :: PathSegment) where