Safe Haskell | None |
---|---|
Language | Haskell2010 |
promoted iterator functions
Synopsis
- data Scanl p q r
- data ScanN n p q
- data ScanNA q
- data FoldN n p q
- data Foldl p q r
- data Unfoldr p q
- data IterateUntil p f
- data IterateWhile p f
- data IterateNWhile n p f
- data IterateNUntil n p f
- data Para (ps :: [k])
- data ParaN (n :: Nat) p
- data DoN (n :: Nat) p
- data Repeat (n :: Nat) p
Documentation
similar to scanl
>>>
pz @(Scanl (Snd Id :+ Fst Id) (Fst Id) (Snd Id)) ([99],[1..5])
PresentT [[99],[1,99],[2,1,99],[3,2,1,99],[4,3,2,1,99],[5,4,3,2,1,99]]
>>>
pl @(Scanl (Snd Id :+ Fst Id) (Fst Id) (Snd Id)) ([99],[])
Present [[99]] (Scanl [[99]] | b=[99] | as=[]) PresentT [[99]]
iterates n times keeping all the results
>>>
pz @(ScanN 4 (Succ Id) Id) 'c'
PresentT "cdefg"
>>>
pz @(Dup >> ScanN 4 (Pred Id *** Succ Id) Id) 'g'
PresentT [('g','g'),('f','h'),('e','i'),('d','j'),('c','k')]
>>>
pz @(ScanN 4 (Succ Id) Id) 4
PresentT [4,5,6,7,8]
>>>
pz @('(0,1) >> ScanN 20 '(Snd Id, Fst Id + Snd Id) Id >> Map (Fst Id) Id) "sdf"
PresentT [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765]
>>>
pl @(ScanN 2 (Succ Id) Id) 4
Present [4,5,6] (Scanl [4,5,6] | b=4 | as=[1,2]) PresentT [4,5,6]
>>>
pl @(ScanN 5 Id Id) 4
Present [4,4,4,4,4,4] (Scanl [4,4,4,4,4,4] | b=4 | as=[1,2,3,4,5]) PresentT [4,4,4,4,4,4]
>>>
pl @(ScanN 2 (Succ Id) Id >> PadR 10 (MEmptyT Ordering) Id) LT
Present [LT,EQ,GT,EQ,EQ,EQ,EQ,EQ,EQ,EQ] ((>>) [LT,EQ,GT,EQ,EQ,EQ,EQ,EQ,EQ,EQ] | {PadR 10 pad=EQ [LT,EQ,GT,EQ,EQ,EQ,EQ,EQ,EQ,EQ] | [LT,EQ,GT]}) PresentT [LT,EQ,GT,EQ,EQ,EQ,EQ,EQ,EQ,EQ]
>>>
pl @(ScanN 4 (Pred Id) Id) 99
Present [99,98,97,96,95] (Scanl [99,98,97,96,95] | b=99 | as=[1,2,3,4]) PresentT [99,98,97,96,95]
tuple version of ScanN
>>>
pl @(ScanNA (Succ Id)) (4,'a')
Present "abcde" (Scanl "abcde" | b='a' | as=[1,2,3,4]) PresentT "abcde"
>>>
pl @(ScanNA (Tail Id)) (4,"abcd" :: String)
Present ["abcd","bcd","cd","d",""] (Scanl ["abcd","bcd","cd","d",""] | b="abcd" | as=[1,2,3,4]) PresentT ["abcd","bcd","cd","d",""]
>>>
pl @(Len &&& Id >> ScanNA (Tail Id)) "abcd"
Present ["abcd","bcd","cd","d",""] ((>>) ["abcd","bcd","cd","d",""] | {Scanl ["abcd","bcd","cd","d",""] | b="abcd" | as=[1,2,3,4]}) PresentT ["abcd","bcd","cd","d",""]
iterates n times keeping only the last result
>>>
pz @(FoldN 4 (Succ Id) Id) 'c'
PresentT 'g'
>>>
pz @(ReadP Day Id >> Id ... FoldN 5 (Succ Id) Id) "2020-07-27"
PresentT [2020-07-27,2020-07-28,2020-07-29,2020-07-30,2020-07-31,2020-08-01]
>>>
pl @(FoldN 2 (Succ Id) Id) LT
Present GT (Last GT | [LT,EQ,GT]) PresentT GT
>>>
pl @(FoldN 30 (Succ Id) Id) LT
Error Succ IO e=Prelude.Enum.Ordering.succ: bad argument (Last) FailT "Succ IO e=Prelude.Enum.Ordering.succ: bad argument"
>>>
pl @(FoldN 6 (Succ Id) Id) 'a'
Present 'g' (Last 'g' | "abcdefg") PresentT 'g'
>>>
pl @(FoldN 6 (Pred Id) Id) 'a'
Present '[' (Last '[' | "a`_^]\\[") PresentT '['
>>>
pl @(FoldN 0 (Succ Id) Id) LT
Present LT (Last LT | [LT]) PresentT LT
>>>
pl @(FoldN 2 (Succ Id) Id >> FoldN 2 (Pred Id) Id) LT
Present LT ((>>) LT | {Last LT | [GT,EQ,LT]}) PresentT LT
>>>
pl @(FoldN 4 ((Id &&& Id) >> SapA) Id) "abc"
Present "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc" (Last "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc" | ["abc","abcabc","abcabcabcabc","abcabcabcabcabcabcabcabc","abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc"]) PresentT "abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc"
Foldl similar to foldl
>>>
pl @(Foldl (Fst Id + Snd Id) 0 (1 ... 10)) ()
Present 55 (Last 55 | [0,1,3,6,10,15,21,28,36,45,55]) PresentT 55
>>>
pz @(Foldl (Snd Id :+ Fst Id) '[99] (1 ... 10)) ()
PresentT [10,9,8,7,6,5,4,3,2,1,99]
>>>
pl @(Foldl (Fst Id) '() (EnumFromTo 1 9999)) ()
Error Scanl list size exceeded (Last) FailT "Scanl list size exceeded"
>>>
pl @(Foldl (Guard "someval" (Fst Id < Snd Id) >> Snd Id) (Head Id) (Tail Id)) [1,4,7,9,16]
Present 16 (Last 16 | [1,4,7,9,16]) PresentT 16
>>>
pl @(Foldl (Guard (PrintT "%d not less than %d" Id) (Fst Id < Snd Id) >> Snd Id) (Head Id) (Tail Id)) [1,4,7,6,16::Int]
Error 7 not less than 6 (Last) FailT "7 not less than 6"
>>>
pl @(Foldl (If ((Fst Id >> Fst Id) && (Snd Id > Snd (Fst Id))) '( 'True, Snd Id) '( 'False, Snd (Fst Id))) '( 'True, Head Id) (Tail Id)) [1,4,7,9,16]
Present (True,16) (Last (True,16) | [(True,1),(True,4),(True,7),(True,9),(True,16)]) PresentT (True,16)
>>>
pl @(Foldl (If ((Fst Id >> Fst Id) && (Snd Id > Snd (Fst Id))) '( 'True, Snd Id) '( 'False, Snd (Fst Id))) '( 'True, Head Id) (Tail Id)) [1,4,7,9,16,2]
Present (False,16) (Last (False,16) | [(True,1),(True,4),(True,7),(True,9),(True,16),(False,16)]) PresentT (False,16)
>>>
pl @(Foldl (Snd Id :+ Fst Id) (MEmptyT [_]) Id) [1..5]
Present [5,4,3,2,1] (Last [5,4,3,2,1] | [[],[1],[2,1],[3,2,1],[4,3,2,1],[5,4,3,2,1]]) PresentT [5,4,3,2,1]
>>>
pl @('Just Uncons >> Foldl (If (Fst (Fst Id)) (If (Snd (Fst Id) < Snd Id) '( 'True,Snd Id) '( 'False, Snd Id)) (Fst Id)) '( 'True,Fst Id) (Snd Id)) [-10,-2,2,3,4,10,9,11]
Present (False,9) ((>>) (False,9) | {Last (False,9) | [(True,-10),(True,-2),(True,2),(True,3),(True,4),(True,10),(False,9),(False,9)]}) PresentT (False,9)
>>>
pl @('Just Uncons >> Foldl (If (Fst (Fst Id)) (If (Snd (Fst Id) < Snd Id) '( 'True,Snd Id) '( 'False, Snd Id)) (Fst Id)) '( 'True,Fst Id) (Snd Id)) [-10,2,3,4,10,11]
Present (True,11) ((>>) (True,11) | {Last (True,11) | [(True,-10),(True,2),(True,3),(True,4),(True,10),(True,11)]}) PresentT (True,11)
similar to unfoldr
>>>
pz @(Unfoldr (MaybeBool (Not Null) (SplitAt 2 Id)) Id) [1..5]
PresentT [[1,2],[3,4],[5]]
>>>
pl @(Unfoldr (If Null (MkNothing _) ('(Take 3 Id, Drop 1 Id) >> MkJust Id)) Id) "abcdefghi"
Present ["abc","bcd","cde","def","efg","fgh","ghi","hi","i"] (Unfoldr "abcdefghi" ["abc","bcd","cde","def","efg","fgh","ghi","hi","i"] | s="abcdefghi") PresentT ["abc","bcd","cde","def","efg","fgh","ghi","hi","i"]
>>>
pl @(Unfoldr (If Null (MkNothing _) (Pure _ (SplitAt 2 Id))) Id) [1..5]
Present [[1,2],[3,4],[5]] (Unfoldr [1,2,3,4,5] [[1,2],[3,4],[5]] | s=[1,2,3,4,5]) PresentT [[1,2],[3,4],[5]]
>>>
pl @(Unfoldr (MaybeBool (Not Null) (SplitAt 2 Id)) Id) [1..5]
Present [[1,2],[3,4],[5]] (Unfoldr [1,2,3,4,5] [[1,2],[3,4],[5]] | s=[1,2,3,4,5]) PresentT [[1,2],[3,4],[5]]
>>>
pl @(Unfoldr (If Null (MkNothing _) (Guard "yy" (Len < 3) >> Pure _ (SplitAt 2 Id))) Id) [1..5]
Error yy (Unfoldr [1,2,3,4,5]) FailT "yy"
>>>
pl @(Unfoldr (MaybeBool (Not Null) (Guard "yy" (Len < 3) >> SplitAt 2 Id)) Id) [1..5]
Error yy (Unfoldr [1,2,3,4,5]) FailT "yy"
>>>
pl @(Unfoldr (Guard "xx" (Len > 4) >> Uncons) Id) [1..10]
Error xx (Unfoldr [1,2,3,4,5,6,7,8,9,10]) FailT "xx"
>>>
pl @(Unfoldr Uncons Id) [1..10]
Present [1,2,3,4,5,6,7,8,9,10] (Unfoldr [1,2,3,4,5,6,7,8,9,10] [1,2,3,4,5,6,7,8,9,10] | s=[1,2,3,4,5,6,7,8,9,10]) PresentT [1,2,3,4,5,6,7,8,9,10]
data IterateUntil p f Source #
unfolds a value applying 'f' until the condition 'p' is true
>>>
pl @(IterateUntil (Id < 90) (Pred Id)) 94
Present [94,93,92,91,90] (Unfoldr 94 [94,93,92,91,90] | s=94) PresentT [94,93,92,91,90]
Instances
P (IterateUntilT p f) x => P (IterateUntil p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator type PP (IterateUntil p f) x :: Type Source # eval :: MonadEval m => proxy (IterateUntil p f) -> POpts -> x -> m (TT (PP (IterateUntil p f) x)) Source # | |
type PP (IterateUntil p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator |
data IterateWhile p f Source #
unfolds a value applying 'f' while the condition 'p' is true
>>>
pl @(IterateWhile (Id > 90) (Pred Id)) 94
Present [94,93,92,91] (Unfoldr 94 [94,93,92,91] | s=94) PresentT [94,93,92,91]
Instances
P (IterateWhileT p f) x => P (IterateWhile p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator type PP (IterateWhile p f) x :: Type Source # eval :: MonadEval m => proxy (IterateWhile p f) -> POpts -> x -> m (TT (PP (IterateWhile p f) x)) Source # | |
type PP (IterateWhile p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator |
data IterateNWhile n p f Source #
unfolds a value applying 'f' while the condition 'p' is true or 'n' times
>>>
pl @(IterateNWhile 10 (Id > 90) (Pred Id)) 95
Present [95,94,93,92,91] ((>>) [95,94,93,92,91] | {Map [95,94,93,92,91] | [(10,95),(9,94),(8,93),(7,92),(6,91)]}) PresentT [95,94,93,92,91]
>>>
pl @(IterateNWhile 3 (Id > 90) (Pred Id)) 95
Present [95,94,93] ((>>) [95,94,93] | {Map [95,94,93] | [(3,95),(2,94),(1,93)]}) PresentT [95,94,93]
Instances
P (IterateNWhileT n p f) x => P (IterateNWhile n p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator type PP (IterateNWhile n p f) x :: Type Source # eval :: MonadEval m => proxy (IterateNWhile n p f) -> POpts -> x -> m (TT (PP (IterateNWhile n p f) x)) Source # | |
type PP (IterateNWhile n p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator |
data IterateNUntil n p f Source #
unfolds a value applying 'f' until the condition 'p' is true or 'n' times
>>>
pl @(IterateNUntil 10 (Id <= 90) (Pred Id)) 95
Present [95,94,93,92,91] ((>>) [95,94,93,92,91] | {Map [95,94,93,92,91] | [(10,95),(9,94),(8,93),(7,92),(6,91)]}) PresentT [95,94,93,92,91]
>>>
pl @(IterateNUntil 3 (Id <= 90) (Pred Id)) 95
Present [95,94,93] ((>>) [95,94,93] | {Map [95,94,93] | [(3,95),(2,94),(1,93)]}) PresentT [95,94,93]
>>>
pl @(IterateNUntil 9999 'False I) 1
Error Unfoldr (9999,1):recursion limit i=100 ((9999,1) (>>) rhs failed) FailT "Unfoldr (9999,1):recursion limit i=100"
Instances
P (IterateNUntilT n p f) x => P (IterateNUntil n p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator type PP (IterateNUntil n p f) x :: Type Source # eval :: MonadEval m => proxy (IterateNUntil n p f) -> POpts -> x -> m (TT (PP (IterateNUntil n p f) x)) Source # | |
type PP (IterateNUntil n p f :: Type) x Source # | |
Defined in Predicate.Data.Iterator |
data Para (ps :: [k]) Source #
runs values in parallel unlike Do
which is serial
>>>
pz @(Para '[Id,Id + 1,Id * 4]) [10,20,30]
PresentT [10,21,120]
>>>
pz @(Para '[Id,Id + 1,Id * 4]) [10,20,30,40]
FailT "Para:invalid length(4) expected 3"
>>>
pl @(Para '[W 'True, Ge 12, W 'False, Lt 2]) [1,2,-99,-999]
Present [True,False,False,True] (Para(0) [True,False,False,True] | [1,2,-99,-999]) PresentT [True,False,False,True]
>>>
pl @(Para '[W 'True, Ge 12, W 'False, Lt 2]) [1,2,-99]
Error Para:invalid length(3) expected 4 FailT "Para:invalid length(3) expected 4"
>>>
pl @(Para '[W 'True, Ge 12, W 'False, Lt 2]) [1,2,-99,-999,1,1,2]
Error Para:invalid length(7) expected 4 FailT "Para:invalid length(7) expected 4"
data ParaN (n :: Nat) p Source #
leverages Para
for repeating expressions (passthrough method)
>>>
pz @(ParaN 4 (Succ Id)) [1..4]
PresentT [2,3,4,5]
>>>
pz @(ParaN 4 (Succ Id)) "azwxm"
FailT "Para:invalid length(5) expected 4"
>>>
pz @(ParaN 4 (Succ Id)) "azwx"
PresentT "b{xy"
>>>
pl @(ParaN 5 (Guard "0-255" (Between 0 255 Id))) [1,2,3,4,12]
Present [1,2,3,4,12] (Para(0) [1,2,3,4,12] | [1,2,3,4,12]) PresentT [1,2,3,4,12]
>>>
pl @(ParaN 5 (Guard "0-255" (Between 0 255 Id))) [1,2,3,400,12]
Error 0-255 (Para(0) rhs failed 1) FailT "0-255"
>>>
pl @(ParaN 4 (PrintF "%03d" Id)) [141,21,3,0::Int]
Present ["141","021","003","000"] (Para(0) ["141","021","003","000"] | [141,21,3,0]) PresentT ["141","021","003","000"]
data DoN (n :: Nat) p Source #
leverages Do
for repeating predicates (passthrough method)
same as DoN n p == FoldN n p Id
but more efficient
>>>
pz @(DoN 4 (Succ Id)) 'c'
PresentT 'g'
>>>
pz @(DoN 4 (Id <> " | ")) "abc"
PresentT "abc | | | | "
>>>
pz @(DoN 4 (Id <> "|" <> Id)) "abc"
PresentT "abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc"
>>>
pl @(DoN 4 (Id + 4)) 1
Present 17 ((>>) 17 | {13 + 4 = 17}) PresentT 17
>>>
pl @(DoN 4 (Id + 7)) 3
Present 31 ((>>) 31 | {24 + 7 = 31}) PresentT 31
>>>
pl @(DoN 4 9) ()
Present 9 ((>>) 9 | {'9}) PresentT 9
>>>
pl @(DoN 4 "xy") 3
Present "xy" ((>>) "xy" | {'"xy"}) PresentT "xy"
data Repeat (n :: Nat) p Source #
creates a promoted list of predicates and then evaluates them into a list. see PP instance for '[k]
>>>
pz @(Repeat 4 (Succ Id)) 'c'
PresentT "dddd"
>>>
pz @(Repeat 4 "abc") ()
PresentT ["abc","abc","abc","abc"]
>>>
pl @(Repeat 4 "xy") 3
Present ["xy","xy","xy","xy"] ('["xy","xy","xy","xy"] ('"xy") | 3) PresentT ["xy","xy","xy","xy"]