predicate-typed-0.7.3.0: Predicates, Refinement types and Dsl

Safe HaskellNone
LanguageHaskell2010

Predicate.Data.Iterator

Description

promoted iterator functions

Synopsis

Documentation

data Scanl p q r Source #

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]]
Instances
(PP p (b, a) ~ b, PP q x ~ b, PP r x ~ [a], P p (b, a), P q x, P r x, Show b, Show a) => P (Scanl p q r :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (Scanl p q r) x :: Type Source #

Methods

eval :: MonadEval m => proxy (Scanl p q r) -> POpts -> x -> m (TT (PP (Scanl p q r) x)) Source #

type PP (Scanl p q r :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (Scanl p q r :: Type) x = [PP q x]

data ScanN n p q Source #

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]
Instances
P (ScanNT n p q) x => P (ScanN n p q :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (ScanN n p q) x :: Type Source #

Methods

eval :: MonadEval m => proxy (ScanN n p q) -> POpts -> x -> m (TT (PP (ScanN n p q) x)) Source #

type PP (ScanN n p q :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (ScanN n p q :: Type) x

data ScanNA q Source #

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",""]
Instances
P (ScanNAT q) x => P (ScanNA q :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (ScanNA q) x :: Type Source #

Methods

eval :: MonadEval m => proxy (ScanNA q) -> POpts -> x -> m (TT (PP (ScanNA q) x)) Source #

type PP (ScanNA q :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (ScanNA q :: Type) x

data FoldN n p q Source #

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"
Instances
P (FoldNT n p q) x => P (FoldN n p q :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (FoldN n p q) x :: Type Source #

Methods

eval :: MonadEval m => proxy (FoldN n p q) -> POpts -> x -> m (TT (PP (FoldN n p q) x)) Source #

type PP (FoldN n p q :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (FoldN n p q :: Type) x

data Foldl p q r Source #

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)
Instances
P (FoldLT p q r) x => P (Foldl p q r :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (Foldl p q r) x :: Type Source #

Methods

eval :: MonadEval m => proxy (Foldl p q r) -> POpts -> x -> m (TT (PP (Foldl p q r) x)) Source #

type PP (Foldl p q r :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (Foldl p q r :: Type) x

data Unfoldr p q Source #

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]
Instances
(PP q a ~ s, PP p s ~ Maybe (b, s), P q a, P p s, Show s, Show b) => P (Unfoldr p q :: Type) a Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (Unfoldr p q) a :: Type Source #

Methods

eval :: MonadEval m => proxy (Unfoldr p q) -> POpts -> a -> m (TT (PP (Unfoldr p q) a)) Source #

type PP (Unfoldr p q :: Type) a Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (Unfoldr p q :: Type) a

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 # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (IterateUntil p f) x :: Type Source #

Methods

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 # 
Instance details

Defined in Predicate.Data.Iterator

type PP (IterateUntil p f :: Type) x

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 # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (IterateWhile p f) x :: Type Source #

Methods

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 # 
Instance details

Defined in Predicate.Data.Iterator

type PP (IterateWhile p f :: Type) x

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 # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (IterateNWhile n p f) x :: Type Source #

Methods

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 # 
Instance details

Defined in Predicate.Data.Iterator

type PP (IterateNWhile n p f :: Type) x

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 # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (IterateNUntil n p f) x :: Type Source #

Methods

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 # 
Instance details

Defined in Predicate.Data.Iterator

type PP (IterateNUntil n p f :: Type) x

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"
Instances
([a] ~ x, GetLen ps, P (ParaImpl (LenT ps) ps) x) => P (Para ps :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (Para ps) x :: Type Source #

Methods

eval :: MonadEval m => proxy (Para ps) -> POpts -> x -> m (TT (PP (Para ps) x)) Source #

type PP (Para ps :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (Para ps :: Type) x

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"]
Instances
(P (ParaImpl (LenT (RepeatT n p)) (RepeatT n p)) x, GetLen (RepeatT n p), x ~ [a]) => P (ParaN n p :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (ParaN n p) x :: Type Source #

Methods

eval :: MonadEval m => proxy (ParaN n p) -> POpts -> x -> m (TT (PP (ParaN n p) x)) Source #

type PP (ParaN n p :: Type) x Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (ParaN n p :: Type) x = PP (Para (RepeatT n p)) x

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"
Instances
P (DoNT n p) a => P (DoN n p :: Type) a Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (DoN n p) a :: Type Source #

Methods

eval :: MonadEval m => proxy (DoN n p) -> POpts -> a -> m (TT (PP (DoN n p) a)) Source #

type PP (DoN n p :: Type) a Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (DoN n p :: Type) a

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"]
Instances
P (RepeatT n p) a => P (Repeat n p :: Type) a Source # 
Instance details

Defined in Predicate.Data.Iterator

Associated Types

type PP (Repeat n p) a :: Type Source #

Methods

eval :: MonadEval m => proxy (Repeat n p) -> POpts -> a -> m (TT (PP (Repeat n p) a)) Source #

type PP (Repeat n p :: Type) a Source # 
Instance details

Defined in Predicate.Data.Iterator

type PP (Repeat n p :: Type) a = PP (RepeatT n p) a