2 | import Data.List.Elem
3 | import Data.SOP.Utils
4 | import Data.SOP.Interfaces
6 | import Decidable.Equality
48 | data NP_ : (k : Type) -> (f : k -> Type) -> (ks : List k) -> Type where
50 | (::) : (v : f t) -> (vs : NP_ k f ks) -> NP_ k f (t :: ks)
56 | NP : {k : Type} -> (f : k -> Type) -> (ks : List k) -> Type
62 | toI : NP_ k f ks -> NP I (map f ks)
64 | toI (h :: t) = h :: toI t
72 | mapNP : (fun : forall a . f a -> g a) -> NP f ks -> NP g ks
74 | mapNP fun (v :: vs) = fun v :: mapNP fun vs
78 | pureNP : {ks : _} -> (forall a . f a) -> NP f ks
79 | pureNP {ks = []} _ = []
80 | pureNP {ks = _ :: _} f = f :: pureNP f
84 | hapNP : NP (\a => f a -> g a) ks -> NP f ks -> NP g ks
86 | hapNP (f :: fs) (v :: vs) = f v :: hapNP fs vs
90 | foldlNP : (fun : acc -> el -> acc) -> acc -> NP (K el) ks -> acc
91 | foldlNP _ acc [] = acc
92 | foldlNP fun acc (v :: vs) = foldlNP fun (fun acc v) vs
96 | foldrNP : (fun : el -> Lazy acc -> acc) -> Lazy acc -> NP (K el) ks -> acc
97 | foldrNP _ acc [] = acc
98 | foldrNP fun acc (v :: vs) = fun v (foldrNP fun acc vs)
102 | sequenceNP : Applicative g => NP (\a => g (f a)) ks -> g (NP f ks)
103 | sequenceNP [] = pure []
104 | sequenceNP (v :: vs) = [| v :: sequenceNP vs |]
108 | collapseNP : NP (K a) ks -> List a
110 | collapseNP (v :: vs) = v :: collapseNP vs
118 | hd : NP f (k :: ks) -> f k
123 | tl : NP f (k :: ks) -> NP f ks
129 | fromListNP : NP f ks -> List a -> Maybe (NP (K a) ks)
130 | fromListNP [] [] = Just []
131 | fromListNP [] (_ :: _) = Nothing
132 | fromListNP (_ :: _) [] = Nothing
133 | fromListNP (_ :: t) (x :: xs) = (x ::) <$> fromListNP t xs
138 | fromList : {ks : _} -> List a -> Maybe (NP (K a) ks)
139 | fromList = fromListNP (pureNP ())
144 | unfoldNP : NP f ks -> (s -> (s,a)) -> s -> NP (K a) ks
145 | unfoldNP [] _ _ = []
146 | unfoldNP (_ :: t) g s = let (s2,v) = g s
147 | in v :: unfoldNP t g s2
152 | unfold : {ks : _} -> (s -> (s,a)) -> s -> NP (K a) ks
153 | unfold = unfoldNP (pureNP ())
159 | iterateNP : NP f ks -> (a -> a) -> a -> NP (K a) ks
160 | iterateNP np f = unfoldNP np (\v => (f v, v))
165 | iterate : {ks : _} -> (a -> a) -> a -> NP (K a) ks
166 | iterate = iterateNP (pureNP ())
171 | 0 Projection : (f : k -> Type) -> (ks : List k) -> (v : k) -> Type
172 | Projection f ks v = NP f ks -> f v
177 | projections : {ks : _} -> NP (Projection f ks) ks
178 | projections {ks = []} = []
179 | projections {ks = (_ :: _)} = hd :: mapNP (. tl) projections
188 | get : (0 t : k) -> {auto prf : Elem t ks} -> NP_ k f ks -> f t
189 | get t {prf = Here} (v :: _) = v
190 | get t {prf = There _} (_ :: vs) = get t vs
201 | (fun : f t -> f t')
202 | -> {auto prf : UpdateOnce t t' ks ks'}
205 | modify fun {prf = UpdateHere} (v :: vs) = fun v :: vs
206 | modify fun {prf = UpdateThere _} (v :: vs) = v :: modify fun vs
215 | {auto _ : Functor g}
216 | -> (fun : f t -> g (f t'))
217 | -> {auto prf : UpdateOnce t t' ks ks'}
220 | modifyF fun {prf = UpdateHere} (v :: vs) = (:: vs) <$> fun v
221 | modifyF fun {prf = UpdateThere _} (v :: vs) = (v ::) <$> modifyF fun vs
228 | (fun : f t -> f t')
229 | -> {auto prf : UpdateMany t t' ks ks'}
232 | modifyMany f {prf = UMNil} [] = []
233 | modifyMany f {prf = UMConsSame x} (v::vs) = f v :: modifyMany f vs
234 | modifyMany f {prf = UMConsDiff x} (v::vs) = v :: modifyMany f vs
242 | {auto _ : Applicative g}
243 | -> (fun : f t -> g (f t'))
244 | -> {auto prf : UpdateMany t t' ks ks'}
247 | modifyManyF f {prf = UMNil} [] = pure []
248 | modifyManyF f {prf = UMConsSame x} (v::vs) = [| f v :: modifyManyF f vs |]
249 | modifyManyF f {prf = UMConsDiff x} (v::vs) = (v ::) <$> modifyManyF f vs
254 | public export %inline
258 | -> {auto prf : UpdateOnce t t' ks ks'}
261 | setAt t v' = modify {t = t} (const v')
266 | public export %inline
270 | -> {auto prf : UpdateMany t t' ks ks'}
273 | setAtMany t v' = modifyMany {t = t} (const v')
277 | public export %inline
282 | -> {auto prf : UpdateOnce t t' ks ks'}
285 | setAt' t _ v' np = setAt t v' np
289 | public export %inline
294 | -> {auto prf : UpdateMany t t' ks ks'}
297 | setAtMany' t _ v' np = setAtMany t v' np
306 | narrow : NP f ks -> {auto prf: Sublist ks' ks} -> NP f ks'
307 | narrow x {prf = SLNil} = []
308 | narrow (v :: vs) {prf = SLSame y} = v :: narrow vs
309 | narrow (_ :: vs) {prf = SLDiff y} = narrow vs
313 | append : NP f ks -> NP f ks' -> NP f (ks ++ ks')
315 | append (v :: vs) y = v :: append vs y
322 | -> (forall k . f k)
324 | -> {auto prf : Sublist ks ks'}
326 | expand f [] = pureNP f
327 | expand f (v :: vs) {prf = SLSame x} = v :: expand f vs
328 | expand f vs {prf = SLDiff x} = f :: expand f vs
337 | -> {auto cs : NP c ks'}
338 | -> (forall k . c k => f k)
339 | -> {auto prf : Sublist ks ks'}
342 | cexpand c {cs = []} f [] = []
343 | cexpand c {cs = _::_} f [] = f :: cexpand c f []
344 | cexpand c {cs = _::_} f (v :: vs) {prf = SLSame x} = v :: cexpand c f vs
345 | cexpand c {cs = _::_} f vs {prf = SLDiff x} = f :: cexpand c f vs
352 | public export %hint
353 | ordToEqNP : NP (Ord . f) ks -> NP (Eq . f) ks
354 | ordToEqNP = mapNP (\_ => %search)
357 | public export %hint
358 | monoidToSemigroupNP : NP (Monoid . f) ks -> NP (Semigroup . f) ks
359 | monoidToSemigroupNP = mapNP (\_ => %search)
365 | public export %inline
366 | HPure k (List k) (NP_ k) where hpure = pureNP
368 | public export %inline
369 | HFunctor k (List k) (NP_ k) where hmap = mapNP
371 | public export %inline
372 | HAp k (List k) (NP_ k) (NP_ k) where hap = hapNP
374 | public export %inline
375 | HFold k (List k) (NP_ k) where
379 | public export %inline
380 | HCollapse k (List k) (NP_ k) List where hcollapse = collapseNP
382 | public export %inline
383 | HSequence k (List k) (NP_ k) where hsequence = sequenceNP
386 | (all : NP (Eq . f) ks) => Eq (NP_ k f ks) where
387 | (==) {all = []} [] [] = True
388 | (==) {all = _ :: _} (v :: vs) (w :: ws) = v == w && vs == ws
391 | (all : NP (Ord . f) ks) => Ord (NP_ k f ks) where
392 | compare {all = []} [] [] = EQ
393 | compare {all = _ :: _} (v :: vs) (w :: ws) = compare v w <+> compare vs ws
396 | (all : NP (Semigroup . f) ks) => Semigroup (NP_ k f ks) where
397 | (<+>) {all = []} [] [] = []
398 | (<+>) {all = _ :: _} (v :: vs) (w :: ws) = (v <+> w) :: (vs <+> ws)
401 | (all : NP (Monoid . f) ks) => Monoid (NP_ k f ks) where
402 | neutral {all = []} = []
403 | neutral {all = _ :: _} = neutral :: neutral
406 | (all : NP (Show . f) ks) => Show (NP_ k f ks) where
407 | show = dispStringList . hcollapse . hcmap (Show . f) show
410 | consInjective : Data.SOP.NP.(::) a b = Data.SOP.NP.(::) c d -> (a = c, b = d)
411 | consInjective Refl = (Refl, Refl)
414 | (all : NP (DecEq . f) ks) => DecEq (NP_ k f ks) where
415 | decEq {all = []} [] [] = Yes Refl
416 | decEq {all = _::_} (v::vs) (w::ws) with (decEq v w)
417 | decEq {all = _::_} (v::vs) (w::ws) | (No contra) =
418 | No $
contra . fst . consInjective
419 | decEq {all = _::_} (v::vs) (v::ws) | (Yes Refl) with (decEq vs ws)
420 | decEq {all = _::_} (v::vs) (v::vs) | (Yes Refl) | (Yes Refl) = Yes Refl
421 | decEq {all = _::_} (v::vs) (v::ws) | (Yes Refl) | (No contra) =
422 | No $
contra . snd . consInjective
428 | Ex1 : NP I [Char,Bool]
431 | Ex2 : NP Maybe [Int,Int,Int]
432 | Ex2 = [Nothing,Nothing,Just 2]
434 | Ex3 : NP (K String) [Char,Bool,Int]
435 | Ex3 = ["Hello","World","!"]
437 | EqTest1 : Ex1 == Ex1 = True
440 | EqTest2 : Ex1 == ['x',False] = False
443 | OrdTest1 : compare Ex1 Ex1 = EQ
446 | OrdTest2 : compare Ex1 ['x',False] = LT
449 | HdTest : hd Ex1 = 'c'
452 | TlTest : tl Ex1 = [True]
455 | SemiTest : the (NP I [String]) ["hello"] <+> ["world"] = ["helloworld"]
458 | NeutralTest : the (NP I [String,List Int]) Prelude.neutral = ["",[]]
461 | HMapTest : hmap Just Ex1 = [Just 'c', Just True]
464 | HCMapRes : NP (K String) [Char,Bool]
465 | HCMapRes = hcmap Show show Ex1
467 | HPureTest : NP Maybe [String,Int]
468 | HPureTest = hpure Nothing
470 | CPureNeutralTest : NP I [String,String]
471 | CPureNeutralTest = hcpure Monoid neutral
473 | Person : (f : Type -> Type) -> Type
474 | Person f = NP f [String,Int]
476 | toPersonMaybe : Person I -> Person Maybe
477 | toPersonMaybe = hmap Just
479 | personShowValues : Person I -> Person (K String)
480 | personShowValues = hcmap Show show
482 | emptyPerson : Person Maybe
483 | emptyPerson = hpure Nothing
485 | fooPerson : Person (K String)
486 | fooPerson = hconst "foo"
488 | Foo : (f : Type -> Type) -> Type
489 | Foo f = NP f [String,String,List Int]
492 | neutralFoo = hcpure Monoid neutral
494 | update : forall a . Maybe a -> I a -> I a
495 | update (Just a) _ = a
496 | update Nothing a = a
498 | updatePerson : Person (\a => a -> a)
499 | updatePerson = hmap update [Just "foo", Nothing]
501 | updatedPerson : Person I
502 | updatedPerson = hap updatePerson ["bar",12]
504 | seqMaybe : NP Maybe [Int,String] -> Maybe (NP I [Int,String])
505 | seqMaybe = hsequence
507 | htraverseEx : NP (Either String) [Int,String] -> Maybe (NP I [Int,String])
508 | htraverseEx = htraverse (either (const Nothing) Just)
510 | interface Read a where
511 | read : String -> Maybe a
513 | hctraverseEx : NP Read [Int,String] => NP (K String) [Int,String] -> Maybe (NP I [Int,String])
514 | hctraverseEx = hctraverse Read read
516 | subproductEx : NP I [Int,String,Bool,Maybe Bool] -> NP I [Int,Bool]
517 | subproductEx np = narrow np