2 | import Data.List.Elem
7 | import Data.SOP.Utils
8 | import Data.SOP.Interfaces
11 | import Decidable.Equality
26 | data SOP_ : (k : Type) -> (f : k -> Type) -> (kss : List $
List k) -> Type where
27 | MkSOP : NS_ (List k) (NP_ k f) kss -> SOP_ k f kss
33 | SOP : {k : Type} -> (f : k -> Type) -> (kss : List (List k)) -> Type
36 | public export %inline
37 | unSOP : SOP_ k f kss -> NS_ (List k) (NP_ k f) kss
38 | unSOP (MkSOP ns) = ns
46 | mapSOP : (fun : forall a . f a -> g a) -> SOP f kss -> SOP g kss
47 | mapSOP fun = MkSOP . mapNS (\p => mapNP fun p) . unSOP
51 | hapSOP : POP (\a => f a -> g a) kss -> SOP f kss -> SOP g kss
52 | hapSOP (MkPOP fs) = MkSOP . hliftA2 (\p => hapNP p) fs . unSOP
56 | foldlSOP : (fun : acc -> el -> acc) -> acc -> SOP (K el) kss -> acc
57 | foldlSOP fun acc (MkSOP $
Z vs) = foldlNP fun acc vs
58 | foldlSOP fun acc (MkSOP $
S x) = foldlSOP fun acc (MkSOP x)
61 | public export %inline
62 | foldrSOP : (fun : el -> Lazy acc -> acc) -> Lazy acc -> SOP (K el) kss -> acc
63 | foldrSOP fun acc (MkSOP $
Z vs) = foldrNP fun acc vs
64 | foldrSOP fun acc (MkSOP $
S x) = foldrSOP fun acc (MkSOP x)
68 | sequenceSOP : Applicative g => SOP (\a => g (f a)) kss -> g (SOP f kss)
69 | sequenceSOP = map MkSOP . sequenceNS . mapNS (\p => sequenceNP p) . unSOP
73 | collapseSOP : SOP (K a) kss -> List a
74 | collapseSOP = collapseNS . mapNS (\v => collapseNP v) . unSOP
83 | 0 InjectionSOP : (f : k -> Type) -> (kss : List $
List k) -> (vs : List k) -> Type
84 | InjectionSOP f kss vs = NP f vs -> K (SOP f kss) vs
89 | injectionsSOP : {kss : _} -> NP_ (List k) (InjectionSOP f kss) kss
90 | injectionsSOP = hmap (MkSOP .) $
injections {ks = kss}
101 | apInjsPOP_ : POP f kss -> NP (K $
SOP f kss) kss
102 | apInjsPOP_ = mapNP (\ns => MkSOP ns) . apInjsNP_ . unPOP
106 | apInjsPOP : POP f kss -> List (SOP f kss)
107 | apInjsPOP = collapseNP . apInjsPOP_
111 | injectSOP : {0 ks : List k} -> (v : NP f ks) -> {auto prf : Elem ks kss} -> SOP f kss
112 | injectSOP v = MkSOP $
inject v
120 | -> {auto prf : Elem ks kss}
122 | extractSOP ks (MkSOP ns) = extract ks {prf} ns
128 | public export %inline
129 | HFunctor k (List $
List k) (SOP_ k) where hmap = mapSOP
131 | public export %inline
132 | HAp k (List $
List k) (POP_ k) (SOP_ k) where hap = hapSOP
134 | public export %inline
135 | HFold k (List $
List k) (SOP_ k) where
140 | HSequence k (List $
List k) (SOP_ k) where hsequence = sequenceSOP
142 | public export %inline
143 | HCollapse k (List $
List k) (SOP_ k) List where hcollapse = collapseSOP
146 | POP (Eq . f) kss => Eq (SOP_ k f kss) where
147 | MkSOP a == MkSOP b = a == b
150 | POP (Ord . f) kss => Ord (SOP_ k f kss) where
151 | compare (MkSOP a) (MkSOP b) = compare a b
154 | POP (Show . f) kss => Show (SOP_ k f kss) where
155 | showPrec p (MkSOP ns) = showCon p "MkSOP" (showArg ns)
161 | POP (Semigroup . f) [ks] => Semigroup (SOP_ k f [ks]) where
162 | MkSOP a <+> MkSOP b = MkSOP $
a <+> b
168 | POP (Monoid . f) [ks] => Monoid (SOP_ k f [ks]) where
169 | neutral = MkSOP neutral
172 | mkSOPInjective : MkSOP a = MkSOP b -> a = b
173 | mkSOPInjective Refl = Refl
176 | POP (DecEq . f) kss => DecEq (SOP_ k f kss) where
177 | decEq (MkSOP a) (MkSOP b) with (decEq a b)
178 | decEq (MkSOP a) (MkSOP a) | Yes Refl = Yes $
cong MkSOP Refl
179 | decEq (MkSOP a) (MkSOP b) | No contra = No (contra . mkSOPInjective)
185 | neutralTest : SOP I [[String, Maybe Int],[()]]
186 | neutralTest = hcpure Monoid neutral
188 | hapTest : SOP Maybe [[String,Int]] -> SOP I [[String,Int]]
189 | hapTest = hap (MkPOP $
[[fromMaybe "foo", const 12]])