2 | import Data.SOP.Utils
3 | import Data.SOP.Interfaces
6 | import Decidable.Equality
22 | data POP_ : (k : Type) -> (f : k -> Type) -> (kss : List (List k)) -> Type where
23 | MkPOP : NP_ (List k) (NP_ k f) kss -> POP_ k f kss
29 | POP : {k : Type} -> (f : k -> Type) -> (kss : List (List k)) -> Type
32 | public export %inline
33 | unPOP : POP_ k f kss -> NP_ (List k) (NP_ k f) kss
34 | unPOP (MkPOP np) = np
42 | mapPOP : (fun : forall a . f a -> g a) -> POP f kss -> POP g kss
43 | mapPOP fun = MkPOP . mapNP (\p => mapNP fun p) . unPOP
47 | purePOP : {kss : _} -> (forall a . f a) -> POP f kss
48 | purePOP {kss = []} fun = MkPOP []
49 | purePOP {kss = _ :: _} fun = let (MkPOP nps) = purePOP fun
50 | in MkPOP $
pureNP fun :: nps
54 | hapPOP : POP (\a => f a -> g a) kss -> POP f kss -> POP g kss
55 | hapPOP (MkPOP fs) = MkPOP . hliftA2 (\p => hapNP p) fs . unPOP
59 | foldlPOP : (fun : acc -> el -> acc) -> acc -> POP (K el) kss -> acc
60 | foldlPOP _ acc (MkPOP []) = acc
61 | foldlPOP fun acc (MkPOP (h::t)) = foldlPOP fun (foldlNP fun acc h) (MkPOP t)
65 | foldrPOP : (fun : el -> Lazy acc -> acc) -> Lazy acc -> POP (K el) kss -> acc
66 | foldrPOP _ acc (MkPOP []) = acc
67 | foldrPOP fun acc (MkPOP (h::t)) = foldrNP fun (foldrPOP fun acc (MkPOP t)) h
71 | sequencePOP : Applicative g => POP (\a => g (f a)) kss -> g (POP f kss)
72 | sequencePOP = map MkPOP . sequenceNP . mapNP (\p => sequenceNP p) . unPOP
76 | collapsePOP : POP (K a) kss -> (List $
List a)
77 | collapsePOP = collapseNP . mapNP (\v => collapseNP v) . unPOP
85 | ordToEqPOP : POP (Ord . f) kss -> POP (Eq . f) kss
86 | ordToEqPOP = mapPOP (\_ => %search)
90 | monoidToSemigroupPOP : POP (Monoid . f) kss -> POP (Semigroup . f) kss
91 | monoidToSemigroupPOP = mapPOP (\_ => %search)
102 | public export %hint
105 | -> {auto prf : forall ks . NP_ k (c . f) ks => c (NP_ k f ks)}
106 | -> NP_ (List k) (c . NP_ k f) kss
107 | popToNP (MkPOP nps) = hmap (\_ => prf) nps
113 | public export %inline
114 | HPure k (List $
List k) (POP_ k) where hpure = purePOP
116 | public export %inline
117 | HFunctor k (List $
List k) (POP_ k) where hmap = mapPOP
119 | public export %inline
120 | HAp k (List $
List k) (POP_ k) (POP_ k) where hap = hapPOP
122 | public export %inline
123 | HFold k (List $
List k) (POP_ k) where
127 | public export %inline
128 | HSequence k (List $
List k) (POP_ k) where hsequence = sequencePOP
130 | public export %inline
131 | HCollapse k (List $
List k) (POP_ k) (List . List) where
132 | hcollapse = collapsePOP
135 | POP (Eq . f) kss => Eq (POP_ k f kss) where
136 | MkPOP a == MkPOP b = a == b
139 | POP (Ord . f) kss => Ord (POP_ k f kss) where
140 | compare (MkPOP a) (MkPOP b) = compare a b
143 | POP (Semigroup . f) kss => Semigroup (POP_ k f kss) where
144 | MkPOP a <+> MkPOP b = MkPOP $
a <+> b
147 | POP (Monoid . f) kss => Monoid (POP_ k f kss) where
148 | neutral = MkPOP neutral
151 | POP (Show . f) kss => Show (POP_ k f kss) where
152 | showPrec p (MkPOP np) = showCon p "MkPOP" (show np)
155 | mkPOPInjective : MkPOP a = MkPOP b -> a = b
156 | mkPOPInjective Refl = Refl
159 | POP (DecEq . f) kss => DecEq (POP_ k f kss) where
160 | decEq (MkPOP a) (MkPOP b) with (decEq a b)
161 | decEq (MkPOP a) (MkPOP a) | Yes Refl = Yes $
cong MkPOP Refl
162 | decEq (MkPOP a) (MkPOP b) | No contra = No (contra . mkPOPInjective)