Copyright | (c) Grant Weyburne 2019 |
---|---|
License | BSD-3 |
Maintainer | gbwey9@gmail.com |
Safe Haskell | None |
Language | Haskell2010 |
Most of this code contains instances of the class P
enabling evaluation of expressions at the type level.
Synopsis
- module UtilP
- module PredicateCore
- data DoN (n :: Nat) p
- data Repeat (n :: Nat) p
- type GuardsNLax prt (n :: Nat) p = GuardsNImpl False prt n p
- type GuardsN prt (n :: Nat) p = GuardsNImpl True prt n p
- data GuardsNImpl (strict :: Bool) prt (n :: Nat) p
- type ParaNLax (n :: Nat) p = ParaNImpl False n p
- type ParaN (n :: Nat) p = ParaNImpl True n p
- data ParaNImpl (strict :: Bool) (n :: Nat) p
- type StripLeft p q = StripLR False p q
- type StripRight p q = StripLR True p q
- data StripLR (right :: Bool) p q
- type TrimEnd p = Trim' False True p
- type TrimStart p = Trim' True False p
- type Trim p = Trim' True True p
- data Trim' (left :: Bool) (right :: Bool) p
- type family FnT ab :: Type where ...
- type (&) p q = q $ p
- data p $ q
- data Join
- data Duplicate
- data Extract
- data p <|> q
- type (*>) p q = q <* p
- data p <* q
- data p <$ q
- type family ApplyConstT (ta :: Type) (b :: Type) :: Type where ...
- type family CheckT (tp :: Type) :: Bool where ...
- type Printf3' (s :: Symbol) = Printfn s (TupleI '[Fst Id, Snd Id, Thd Id])
- type Printf3 (s :: Symbol) = Printfn s '(Fst Id, '(Snd Id, '(Thd Id, ())))
- type Printf2 (s :: Symbol) = Printfn s '(Fst Id, '(Snd Id, ()))
- type PrintfntLax (n :: Nat) s = Printfn s (TupleListLax n)
- type Printfnt (n :: Nat) s = Printfn s (TupleList n)
- data Printfn s p
- data ReverseTupleN
- type TupleListLax (n :: Nat) = TupleListImpl False n
- type TupleList (n :: Nat) = TupleListImpl True n
- data TupleListImpl (strict :: Bool) (n :: Nat)
- class PrintC x where
- prtC :: (PrintfArg a, PrintfType r) => String -> (a, x) -> r
- type Sapa = Fst Id <> Snd Id
- type Sapa' (t :: Type) = Wrap t (Fst Id) <> Wrap t (Snd Id)
- data p <> q
- type IsSuffixI p q = IsFixImpl GT True p q
- type IsInfixI p q = IsFixImpl EQ True p q
- type IsPrefixI p q = IsFixImpl LT True p q
- type IsSuffix p q = IsFixImpl GT False p q
- type IsInfix p q = IsFixImpl EQ False p q
- type IsPrefix p q = IsFixImpl LT False p q
- data IsFixImpl (cmp :: Ordering) (ignore :: Bool) p q
- type Nothing' = Guard "expected Nothing" IsNothing
- data Stdin
- type Stderr p = WritefileImpl FStderr p
- type Stdout p = WritefileImpl FStdout p
- type Writefile (s :: Symbol) p = WritefileImpl (FOther s WFWrite) p
- type Writefile' (s :: Symbol) p = WritefileImpl (FOther s WFWriteForce) p
- type Appendfile (s :: Symbol) p = WritefileImpl (FOther s WFAppend) p
- data WritefileImpl (hh :: FHandle Symbol) p
- class GetMode (x :: WFMode) where
- data WFMode
- class GetFHandle (x :: FHandle Symbol) where
- data FHandle s
- data TimeZ
- data TimeU
- data ReadEnvAll
- data ReadEnv p
- type DirExists p = ReadDir p >> IsJust
- data ReadDir p
- type FileExists p = ReadFile p >> IsJust
- data ReadFile p
- type H = Hide
- data Hide p
- type Traverse p q = Map p q >> Sequence
- data Sequence
- type FailCase p = Fail (Snd Id >> Unproxy) (Fst Id >> p)
- type Case'' s (ps :: [k]) (qs :: [k1]) (r :: k2) = Case (FailCase s) ps qs r
- type Case' (ps :: [k]) (qs :: [k1]) (r :: k2) = Case (Snd Id >> Failp "Case:no match") ps qs r
- data Case (e :: k0) (ps :: [k]) (qs :: [k1]) (r :: k2)
- data CaseImpl (n :: Nat) (e :: k0) (ps :: [k]) (qs :: [k1]) (r :: k2)
- type GuardsViaPara prt ps = Para (GuardsViaParaT prt ps)
- type family GuardsViaParaT prt ps where ...
- data ParaImplW (strict :: Bool) (ps :: [k])
- type ParaLax (os :: [k]) = ParaImplW False os
- type Para (os :: [k]) = ParaImplW True os
- data ParaImpl (n :: Nat) (strict :: Bool) (os :: [k])
- type family ToGuardsT (prt :: k) (os :: [k1]) :: [(k, k1)] where ...
- type ToGuards (prt :: k) (os :: [k1]) = Proxy (Guards (ToGuardsT prt os))
- type ToPara (os :: [k]) = Proxy (ParaImplW True os)
- type Guards' (ps :: [k]) = Para (GuardsT ps)
- type family GuardsT (ps :: [k]) where ...
- data Printf s p
- data Intercalate p q
- type AssocR = '(Fst I >> Fst I, Snd I *** I)
- type AssocL = '(I *** Fst I, Snd I >> Snd I)
- type ShowBase (n :: Nat) = ShowBase' n Id
- data ShowBase' (n :: Nat) p
- type ReadBaseInt (n :: Nat) = ReadBase' (Hole Int) n Id
- type ReadBase (t :: Type) (n :: Nat) = ReadBase' (Hole t) n Id
- data ReadBase' t (n :: Nat) p
- data Luhn p
- type Zipn p q = Zip False False p q
- type Ziprc p q = Zip False True p q
- type Ziplc p q = Zip True False p q
- data Zip (lc :: Bool) (rc :: Bool) p q
- type family ExtractAFromTA (ta :: Type) :: Type where ...
- data ZipThese p q
- data Char1 (s :: Symbol)
- type Singleton p = p :+ EmptyT [] p
- type EmptyList (t :: Type) = EmptyList' (Hole t)
- data EmptyList' t
- type Theseid p q = TheseIn '(I, p) '(q, I) I
- data TheseIn p q r
- type IsThese p = IsTh (These () ()) p
- type IsThat p = IsTh (That ()) p
- type IsThis p = IsTh (This ()) p
- data IsTh (th :: These x y) p
- data FromListF (t :: Type)
- data FromList (t :: Type)
- data ToListExt
- data ToList' p
- data ToList
- type IToList (t :: Type) = IToList' (Hole t) Id
- data IToList' t p
- type Ne n = Cmp Cne I n
- type Lt n = Cmp Clt I n
- type Le n = Cmp Cle I n
- type Same n = Cmp Ceq I n
- type Ge n = Cmp Cge I n
- type Gt n = Cmp Cgt I n
- data CmpI (o :: OrderingP) p q
- data Cmp (o :: OrderingP) p q
- type (===?) p q = OrdI p q
- data OrdI p q
- type OrdA p = OrdA' p p
- type OrdA' p q = OrdP (Fst Id >> p) (Snd Id >> q)
- type (===) p q = OrdP p q
- data OrdP p q
- type Imply p q = p ~> q
- data (p :: k) ~> (q :: k1)
- type OR p q = p || q
- data (p :: k) || (q :: k1)
- type And p q = p && q
- data (p :: k) && (q :: k1)
- type (<<) p q = q >> p
- data (p :: k) >> (q :: k1)
- type (>|) p q = p >> Skip q
- type (|>) p q = Skip p >> q
- data Skip p
- data GuardSimple p
- type ExitWhen' p = ExitWhen "ExitWhen" p
- type ExitWhen prt p = Guard prt (Not p)
- type Guard' p = Guard "Guard" p
- data Guard prt p
- data GuardsImplW (strict :: Bool) (ps :: [(k, k1)])
- type GuardsQuick (prt :: k) (os :: [k1]) = Guards (ToGuardsT prt os)
- type GuardsLax (os :: [(k, k1)]) = GuardsImplW False os
- type Guards (os :: [(k, k1)]) = GuardsImplW True os
- data GuardsImpl (n :: Nat) (strict :: Bool) (os :: [(k, k1)])
- type OneP = Guard (Printf "expected list of length 1 but found length=%d" Len) (Len >> Same 1) >> Head
- type Rem p q = Snd (QuotRem p q)
- type Quot p q = Fst (QuotRem p q)
- data QuotRem p q
- data DivMod p q
- data Mod p q
- data Div p q
- type Mod' p q = Snd (DivMod p q)
- type Div' p q = Fst (DivMod p q)
- type Odd = Mod I 2 == 1
- type Even = Mod I 2 == 0
- type FailCatch s = Fail (Snd Id >> Unproxy) (Fst Id >> s)
- type Catch' p s = Catch p (FailCatch s)
- data Catch p q
- data Unproxy
- type T (t :: Type) = Hole t
- data Hole (t :: Type)
- type FailPrt2 (t :: Type) prt = Fail (Hole t) (Printf2 prt)
- type FailPrt (t :: Type) prt = Fail (Hole t) (Printf prt)
- type FailS s = Fail I s
- type Failt (t :: Type) prt = Fail (Hole t) prt
- type Failp s = Fail Unproxy s
- data Fail t prt
- type Span p q = Break (Not p) q
- data Break p q
- type FilterBy p q = Partition p q >> Fst Id
- data Partition p q
- data Pairs
- data If p q r
- type ConcatMap p q = Concat (Map p q)
- data Map p q
- type IterateNUntil n p f = IterateNWhile n (Not p) f
- type IterateNWhile n p f = '(n, Id) >> (IterateWhile ((Fst Id > 0) && (Snd Id >> p)) (Pred Id *** f) >> Map (Snd Id) Id)
- type IterateWhile p f = Unfoldr (MaybeB p '(Id, f)) Id
- type IterateUntil p f = IterateWhile (Not p) f
- type IterateN n f = Unfoldr (MaybeB (Fst Id > 0) '(Snd Id, Pred Id *** f)) '(n, Id)
- data Unfoldr p q
- type family UnfoldT mbs where ...
- type Foldl p q r = Last' (Scanl p q r)
- type FoldN n p q = Last' (ScanN n p q)
- type ScanNA q = ScanN (Fst Id) (Snd Id) q
- type ScanN n p q = Scanl (Fst Id >> q) p (EnumFromTo 1 n)
- data Scanl p q r
- type Theses = PartitionThese >> Thd Id
- type Thats = PartitionThese >> Snd Id
- type Thiss = PartitionThese >> Fst Id
- data PartitionThese
- data PartitionEithers
- type CatMaybes q = MapMaybe Id q
- type MapMaybe p q = ConcatMap (p >> MaybeIn MEmptyP '[Id]) q
- data EnumFromTo p q
- data Null
- data IsEmpty
- data Unsnoc
- data Uncons
- data p +: q
- data p :+ q
- type Ors' p = FoldMap Any p
- data Ors p
- type Ands' p = FoldMap All p
- data Ands p
- type Lookup' (t :: Type) p q = (q &&& Lookup p q) >> If (Snd Id >> IsNothing) (ShowP (Fst Id) >> Fail (Hole t) (Printf "index(%s) not found" Id)) (Snd Id >> Just Id)
- type (!!!) p q = Lookup p q >> MaybeIn (Failp "index not found") Id
- data Lookup p q
- type (!!) p q = IxL p q (Failp "(!!) index not found")
- data IxL p q def
- type Ix' (n :: Nat) = Ix n (Failp "Ix index not found")
- data Ix (n :: Nat) def
- type ProxyT (t :: Type) = ProxyT' (Hole t)
- data ProxyT' t
- data Concat p
- type Min' (t :: Type) = FoldMap (Min t) Id
- type Sum (t :: Type) = FoldMap (Sum t) Id
- type FoldMap (t :: Type) p = Map (Wrap t Id) p >> Unwrap (MConcat Id)
- data MConcat p
- data MkThese p q
- type MkThat (t :: Type) p = MkThat' (Hole t) p
- data MkThat' t p
- type MkThis (t :: Type) p = MkThis' (Hole t) p
- data MkThis' t p
- type MkRight (t :: Type) p = MkRight' (Hole t) p
- data MkRight' t p
- type MkLeft (t :: Type) p = MkLeft' (Hole t) p
- data MkLeft' t p
- data MkJust p
- type MkNothing (t :: Type) = MkNothing' (Hole t)
- data MkNothing' t
- data EmptyT (t :: Type -> Type) p
- data MEmptyProxy
- type MEmptyP = MEmptyT' Unproxy
- type MEmptyT (t :: Type) = MEmptyT' (Hole t)
- data MEmptyT' t
- type PMEmpty = MEmptyT' Proxy
- data Pure (t :: Type -> Type) p
- data STimes n p
- type IsJust = MaybeIn False True
- type IsNothing = MaybeIn True False
- data MaybeIn p q
- type family TheseXT lr x p where ...
- data TheseX p q r s
- type family EitherXT lr x p where ...
- data EitherX p q r
- data TheseToMaybe
- data ThatToMaybe
- data ThisToMaybe
- data RightToMaybe
- data LeftToMaybe
- type family MaybeXPT lr x q where ...
- type MaybeX p q r = MaybeXP (Fst Id >> p) q r
- data MaybeXP p q r
- type TheseFail msg q = GFail TheseToMaybe msg q
- type TheseP q = GProxy TheseToMaybe q
- type TheseDef p q = GDef TheseToMaybe p q
- type ThatFail msg q = GFail ThatToMaybe msg q
- type ThatP q = GProxy ThatToMaybe q
- type ThatDef p q = GDef ThatToMaybe p q
- type ThisFail msg q = GFail ThisToMaybe msg q
- type ThisP q = GProxy ThisToMaybe q
- type ThisDef p q = GDef ThisToMaybe p q
- type RightFail msg q = GFail RightToMaybe msg q
- type RightP q = GProxy RightToMaybe q
- type RightDef p q = GDef RightToMaybe p q
- type LeftFail msg q = GFail LeftToMaybe msg q
- type LeftP q = GProxy LeftToMaybe q
- type LeftDef p q = GDef LeftToMaybe p q
- type JustFail msg q = GFail I msg q
- type JustP q = GProxy I q
- type JustDef p q = GDef I p q
- type TheseIn' p = TheseFail "expected These" p
- type That' p = ThatFail "expected That" p
- type This' p = ThisFail "expected This" p
- type Right' p = RightFail "expected Right" p
- type Left' p = LeftFail "expected Left" p
- type Just' p = JustFail "expected Just" p
- type LookupFail msg x y = LookupFail' msg x y I
- type LookupP x y = LookupP' x y I
- type LookupDef x y p = LookupDef' x y p I
- type LookupFail' msg x y q = GFail (Lookup x y) msg q
- type LookupP' x y q = GProxy (Lookup x y) q
- type LookupDef' x y p q = GDef (Lookup x y) p q
- type GFail z msg q = '(I, q >> z) >> MaybeXP (Fail (PA >> Unproxy) (X >> msg)) A A
- type GProxy z q = '(I, q >> z) >> MaybeXP (PA >> MEmptyP) A A
- type GDef z p q = '(I, q >> z) >> MaybeXP (X >> p) A A
- type GDef_PA z p q r = (Hide % '(I, r >> z)) >> MaybeXP (PA >> p) ('(X, A) >> q) A
- type JustDef''' p q r = GDef_X I p q r
- type GDef_X z p q r = '(I, r >> z) >> MaybeXP (X >> p) ('(X, A) >> q) A
- type XPA = I
- type XA = I
- type X = Fst (Fst I)
- type A = Snd I
- type PA = Snd I
- type JustDef'' p q r = GDef'' I p q r
- type GDef'' z p q r = '(I, r >> z) >> MaybeXP p q (Snd Id)
- type JustDef' p q r = GDef' I p q r
- type GDef' z p q r = '(I, r >> z) >> MaybeXP (X >> p) q (Snd Id)
- type InitFail msg q = GFail (Unsnoc >> Fmap_1) msg q
- type InitP q = GProxy (Unsnoc >> Fmap_1) q
- type InitDef p q = GDef (Unsnoc >> Fmap_1) p q
- type LastFail msg q = GFail (Unsnoc >> Fmap_2) msg q
- type LastP q = GProxy (Unsnoc >> Fmap_2) q
- type LastDef p q = GDef (Unsnoc >> Fmap_2) p q
- type TailFail msg q = GFail (Uncons >> Fmap_2) msg q
- type TailP q = GProxy (Uncons >> Fmap_2) q
- type TailDef p q = GDef (Uncons >> Fmap_2) p q
- type HeadFail msg q = GFail (Uncons >> Fmap_1) msg q
- type HeadP q = GProxy (Uncons >> Fmap_1) q
- type HeadDef p q = GDef (Uncons >> Fmap_1) p q
- data Fmap_2
- data Fmap_1
- type Init' p = InitFail "Init(empty)" p
- type Last' p = LastFail "Last(empty)" p
- type Tail' p = TailFail "Tail(empty)" p
- type Head' p = HeadFail "Head(empty)" p
- data Elem p q
- type Keep p q = KeepImpl True p q
- type Remove p q = KeepImpl False p q
- data KeepImpl (keep :: Bool) p q
- data Not p
- data Prime p
- type ToEnumBF (t :: Type) = ToEnumB' (Hole t) (Failp "ToEnum bounded failed")
- type ToEnumB (t :: Type) def = ToEnumB' (Hole t) def
- data ToEnumB' t def
- type ToEnum (t :: Type) p = ToEnum' (Hole t) p
- data ToEnum' t p
- data FromEnum p
- data Pred p
- data Succ p
- type PredB' q = PredB (Failp "Pred bounded failed") q
- data PredB p q
- type SuccB' q = SuccB (Failp "Succ bounded failed") q
- data SuccB p q
- class SwappedC p where
- swappedC :: p a b -> p b a
- data Swap
- data ReverseL
- data Reverse
- type Left t = Right t >> Swap
- type Right t = Pure (Either t) Id
- data Pure2 (t :: Type -> Type)
- type MEmptyT2 t = MEmptyT2' (Hole t)
- data MEmptyT2' t
- data Coerce2 (t :: k)
- data Coerce (t :: k)
- type Wrap (t :: Type) p = Wrap' (Hole t) p
- data Wrap' t p
- data Unwrap p
- data Signum p
- data Abs p
- data Negate p
- type (-%) p q = Negate (p % q)
- type (%-) p q = Negate (p % q)
- data p % q
- type (/) p q = DivF p q
- data DivF p q
- data Bin (op :: BinOp) p q
- class GetBinOp (k :: BinOp) where
- type (<?) p q = CmpI Clt p q
- type (<=?) p q = CmpI Cle p q
- type (/=?) p q = CmpI Cne p q
- type (==?) p q = CmpI Ceq p q
- type (>=?) p q = CmpI Cge p q
- type (>?) p q = CmpI Cgt p q
- type (<) p q = Cmp Clt p q
- type (<=) p q = Cmp Cle p q
- type (/=) p q = Cmp Cne p q
- type (==) p q = Cmp Ceq p q
- type (>=) p q = Cmp Cge p q
- type (>) p q = Cmp Cgt p q
- type * p q = Mult p q
- type (-) p q = Sub p q
- type (+) p q = Add p q
- type Sub p q = Bin BSub p q
- type Add p q = Bin BAdd p q
- type Mult p q = Bin BMult p q
- data BinOp
- type Dup = '(Id, Id)
- data (p :: k) +++ (q :: k1)
- type IsRight = False ||| True
- type IsLeft = True ||| False
- type EitherIn p q = p ||| q
- data (p :: k) ||| (q :: k1)
- type Second q = Star I q
- type First p = Star p I
- type Star p q = p *** q
- data (p :: k) *** (q :: k1)
- type (&&&) p q = W '(p, q)
- type Last = Unsnoc >> Just (Snd Id)
- type Init = Unsnoc >> Just (Fst Id)
- type Head = Uncons >> Just (Fst Id)
- type Tail = Uncons >> Just (Snd Id)
- type Drop n p = Snd (SplitAt n p)
- type Take n p = Fst (SplitAt n p)
- data SplitAt n p
- data SplitAts ns p
- type PadR n p q = Pad False n p q
- type PadL n p q = Pad True n p q
- data Pad (left :: Bool) n p q
- type Msg' prt p = Msg (Printf "[%s] " prt) p
- data TupleI (ps :: [k])
- data EitherB b p q
- data MaybeB b p
- data Do (ps :: [k])
- type family DoExpandT (ps :: [k]) :: Type where ...
- data MkProxy
- type Floor (t :: Type) p = Floor' (Hole t) p
- data Floor' t p
- type Ceiling (t :: Type) p = Ceiling' (Hole t) p
- data Ceiling' t p
- type Truncate (t :: Type) p = Truncate' (Hole t) p
- data Truncate' t p
- type FromRational (t :: Type) p = FromRational' (Hole t) p
- data FromRational' t r
- data ToRational p
- type FromIntegral (t :: Type) p = FromIntegral' (Hole t) p
- data FromIntegral' t n
- type FromIntegerP n = FromInteger' Unproxy n
- type FromInteger (t :: Type) p = FromInteger' (Hole t) p
- data FromInteger' t n
- type FromStringP (t :: Type) p = FromStringP' (Hole t) p
- data FromStringP' t s
- class ExtractL6C tp where
- type ExtractL6T tp
- extractL6C :: tp -> ExtractL6T tp
- data L6 p
- class ExtractL5C tp where
- type ExtractL5T tp
- extractL5C :: tp -> ExtractL5T tp
- data L5 p
- class ExtractL4C tp where
- type ExtractL4T tp
- extractL4C :: tp -> ExtractL4T tp
- data L4 p
- class ExtractL3C tp where
- type ExtractL3T tp
- extractL3C :: tp -> ExtractL3T tp
- type Thd p = L3 p
- data L3 p
- class ExtractL2C tp where
- type ExtractL2T tp
- extractL2C :: tp -> ExtractL2T tp
- type Snd p = L2 p
- data L2 p
- class ExtractL1C tp where
- type ExtractL1T tp
- extractL1C :: tp -> ExtractL1T tp
- type Fst p = L1 p
- data L1 p
- data Length p
- data Len
- type SortByHelper p = Partition (p >> (Id == GT)) Id
- type SortOnDesc p q = SortBy (Swap >> OrdA p) q
- type SortOn p q = SortBy (OrdA p) q
- data SortBy p q
- type Max' t = FoldMap (Max t) Id
- data Max
- data Min
- type ReadP' (t :: Type) p = ReadP'' (Hole t) p
- type ReadP (t :: Type) = ReadP'' (Hole t) Id
- data ReadP'' t p
- data UnMkDay p
- type MkDay = MkDay' (Fst Id) (Snd Id) (Thd Id)
- data MkDay' p q r
- type ParseTimes (t :: Type) p q = ParseTimes' (Hole t) p q
- data ParseTimes' t p q
- type ParseTimeP (t :: Type) p q = ParseTimeP' (Hole t) p q
- data ParseTimeP' t p q
- data FormatTimeP p q
- data ShowP p
- data Ones p
- data Tails
- data Inits
- data ToUpper
- data ToLower
- type IsLatin1 = IsCharSet CLatin1
- type IsSeparator = IsCharSet CSeparator
- type IsOctDigit = IsCharSet COctDigit
- type IsHexDigit = IsCharSet CHexDigit
- type IsControl = IsCharSet CControl
- type IsPunctuation = IsCharSet CPunctuation
- type IsSpace = IsCharSet CSpace
- type IsNumber = IsCharSet CNumber
- type IsUpper = IsCharSet CUpper
- type IsLower = IsCharSet CLower
- class GetCharSet (cs :: CharSet) where
- getCharSet :: (CharSet, Char -> Bool)
- data CharSet
- = CLower
- | CUpper
- | CNumber
- | CSpace
- | CPunctuation
- | CControl
- | CHexDigit
- | COctDigit
- | CSeparator
- | CLatin1
- data IsCharSet (cs :: CharSet)
- data MakeRR3 p
- data MakeRR2 p
- data MakeRR1 p
- data MakeRR p
- type ReplaceOneString p q r = ReplaceOneString' '[] p q r
- type ReplaceOneString' (rs :: [ROpt]) p q r = ReplaceOne' rs p (MakeRR q) r
- type ReplaceAllString p q r = ReplaceAllString' '[] p q r
- type ReplaceAllString' (rs :: [ROpt]) p q r = ReplaceAll' rs p (MakeRR q) r
- type ReplaceOne p q r = ReplaceOne' '[] p q r
- type ReplaceOne' (rs :: [ROpt]) p q r = ReplaceImpl False rs p q r
- type ReplaceAll p q r = ReplaceAll' '[] p q r
- type ReplaceAll' (rs :: [ROpt]) p q r = ReplaceImpl True rs p q r
- data ReplaceImpl (alle :: Bool) (rs :: [ROpt]) p q r
- type Resplit p q = Resplit' '[] p q
- data Resplit' (rs :: [ROpt]) p q
- type RescanRanges p q = RescanRanges' '[] p q
- data RescanRanges' (rs :: [ROpt]) p q
- type Rescan p q = Rescan' '[] p q
- data Rescan' (rs :: [ROpt]) p q
- type Re p q = Re' '[] p q
- data Re' (rs :: [ROpt]) p q
- type Unzip = '(Map (Fst Id) Id, Map (Snd Id) Id)
- type Any x p = Ors (Map x p)
- type All x p = Ands (Map x p)
- type AllNegative' = FoldMap All (Map Negative Id)
- type AllPositive' = FoldMap All (Map Positive Id)
- type Negative = Lt 0
- type Positive = Gt 0
- type AllNegative = Ands (Map Negative Id)
- type AllPositive = Ands (Map Positive Id)
- type Between' p q r = (r >= p) && (r <= q)
- type Between p q = Ge p && Le q
- type Desc' = Ands (Map (Fst Id > Snd Id) Pairs)
- type Desc = Ands (Map (Fst Id >= Snd Id) Pairs)
- type Asc' = Ands (Map (Fst Id < Snd Id) Pairs)
- type Asc = Ands (Map (Fst Id <= Snd Id) Pairs)
- _MX :: Int
- strictmsg :: forall strict. GetBool strict => String
- simpleAlign :: [a] -> [b] -> [These a b]
- getValidBase :: Int -> String
- getStringPrefix :: String -> (String, String)
- evalQuick :: forall p i. P p i => i -> Either String (PP p i)
Documentation
module UtilP
module PredicateCore
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
>>>
pl @(DoN 4 (Succ Id)) 'c'
Present 'g' PresentT 'g'
>>>
pl @(DoN 4 (Id <> " | ")) "abc"
Present "abc | | | | " PresentT "abc | | | | "
>>>
pl @(DoN 4 (Id <> "|" <> Id)) "abc"
Present "abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc" PresentT "abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc|abc"
data Repeat (n :: Nat) p Source #
creates a promoted list of predicates and then evaluates them into a list. see PP instance for '[k]
>>>
pl @(Repeat 4 (Succ Id)) 'c'
Present "dddd" PresentT "dddd"
>>>
pl @(Repeat 4 "abc") ()
Present ["abc","abc","abc","abc"] PresentT ["abc","abc","abc","abc"]
type GuardsNLax prt (n :: Nat) p = GuardsNImpl False prt n p Source #
data GuardsNImpl (strict :: Bool) prt (n :: Nat) p Source #
leverages GuardsQuick
for repeating predicates (passthrough method)
>>>
pl @(GuardsN (Printf2 "id=%d must be between 0 and 255, found %d") 4 (Between 0 255)) [121,33,7,256]
Error id=4 must be between 0 and 255, found 256 FailT "id=4 must be between 0 and 255, found 256"
>>>
pl @(GuardsN (Printf2 "id=%d must be between 0 and 255, found %d") 4 (Between 0 255)) [121,33,7,44]
Present [121,33,7,44] PresentT [121,33,7,44]
Instances
(GetBool strict, GetLen (ToGuardsT prt (RepeatT n p)), P (GuardsImpl (LenT (ToGuardsT prt (RepeatT n p))) strict (ToGuardsT prt (RepeatT n p))) [a]) => P (GuardsNImpl strict prt n p :: Type) [a] Source # | |
type PP (GuardsNImpl strict prt n p :: Type) [a] Source # | |
Defined in Predicate type PP (GuardsNImpl strict prt n p :: Type) [a] = PP (GuardsImplW strict (ToGuardsT prt (RepeatT n p))) [a] |
data ParaNImpl (strict :: Bool) (n :: Nat) p Source #
leverages Para
for repeating predicates (passthrough method)
>>>
pl @(ParaNImpl 'True 4 (Succ Id)) [1..4]
Present [2,3,4,5] PresentT [2,3,4,5]
>>>
pl @(ParaNLax 4 (Succ Id)) "azwxm"
Present "b{xy" PresentT "b{xy"
>>>
pl @(ParaN 4 (Succ Id)) "azwxm"
Error Para: data elements(5) /= predicates(4) FailT "Para: data elements(5) /= predicates(4)"
>>>
pl @(ParaN 4 (Succ Id)) "azwx"
Present "b{xy" PresentT "b{xy"
type StripRight p q = StripLR True p q Source #
data StripLR (right :: Bool) p q Source #
similar to stripLeft
stripRight
>>>
pl @(StripLeft "xyz" Id) ("xyzHello" :: String)
Present Just "Hello" PresentT (Just "Hello")
>>>
import Data.Text (Text)
>>>
pl @(StripLeft "xyz" Id) ("xyzHello" :: Text)
Present Just "Hello" PresentT (Just "Hello")
>>>
pl @(StripLeft "xyz" Id) "xywHello"
Present Nothing PresentT Nothing
>>>
pl @(StripRight "xyz" Id) "Hello xyz"
Present Just "Hello " PresentT (Just "Hello ")
>>>
pl @(StripRight "xyz" Id) "xyzHelloxyw"
Present Nothing PresentT Nothing
>>>
pl @(StripRight "xyz" Id) ""
Present Nothing PresentT Nothing
>>>
pl @(StripRight "xyz" "xyz") ()
Present Just "" PresentT (Just "")
data Trim' (left :: Bool) (right :: Bool) p Source #
similar to strip
stripStart
stripEnd
>>>
pl @(Trim (Snd Id)) (20," abc " :: String)
Present "abc" PresentT "abc"
>>>
import Data.Text (Text)
>>>
pl @(Trim (Snd Id)) (20," abc " :: Text)
Present "abc" PresentT "abc"
>>>
pl @(TrimStart (Snd Id)) (20," abc ")
Present "abc " PresentT "abc "
>>>
pl @(TrimEnd (Snd Id)) (20," abc ")
Present " abc" PresentT " abc"
>>>
pl @(TrimEnd " abc ") ()
Present " abc" PresentT " abc"
>>>
pl @(TrimEnd "") ()
Present "" PresentT ""
>>>
pl @(Trim " ") ()
Present "" PresentT ""
>>>
pl @(Trim "") ()
Present "" PresentT ""
similar to join
>>>
pl @Join (Just (Just 20))
Present Just 20 PresentT (Just 20)
>>>
pl @Join ["ab","cd","","ef"]
Present "abcdef" PresentT "abcdef"
similar to duplicate
>>>
pl @Duplicate (20,"abc")
Present (20,(20,"abc")) PresentT (20,(20,"abc"))
similar to extract
>>>
pl @Extract (Nothing,Just 20)
Present Just 20 PresentT (Just 20)
>>>
pl @Extract (Identity 20)
Present 20 PresentT 20
data p <|> q infixl 3 Source #
similar to <|>
>>>
pl @(Fst Id <|> Snd Id) (Nothing,Just 20)
Present Just 20 PresentT (Just 20)
>>>
pl @(Fst Id <|> Snd Id) (Just 10,Just 20)
Present Just 10 PresentT (Just 10)
>>>
pl @(Fst Id <|> Snd Id) (Nothing,Nothing)
Present Nothing PresentT Nothing
type (*>) p q = q <* p infixl 4 Source #
similar to <*
>>>
pl @(Fst Id <* Snd Id) (Just "abc",Just 20)
Present Just "abc" PresentT (Just "abc")
similar to <$
>>>
pl @(Fst Id <$ Snd Id) ("abc",Just 20)
Present Just "abc" PresentT (Just "abc")
type Printf3 (s :: Symbol) = Printfn s '(Fst Id, '(Snd Id, '(Thd Id, ()))) Source #
print a 3-tuple
>>>
pl @(Printf3 "fst=%s snd=%03d thd=%s") ("ab",123,"xx")
Present "fst=ab snd=123 thd=xx" PresentT "fst=ab snd=123 thd=xx"
type Printf2 (s :: Symbol) = Printfn s '(Fst Id, '(Snd Id, ())) Source #
print a 2-tuple
>>>
pl @(Printf2 "fst=%s snd=%03d") ("ab",123)
Present "fst=ab snd=123" PresentT "fst=ab snd=123"
type PrintfntLax (n :: Nat) s = Printfn s (TupleListLax n) Source #
Printfn prints an inductive tuple
>>>
pl @(Printfn "%s %s" Id) ("123",("def",()))
Present "123 def" PresentT "123 def"
>>>
pl @(Printfn "s=%s d=%03d" Id) ("ab",(123,()))
Present "s=ab d=123" PresentT "s=ab d=123"
data ReverseTupleN Source #
reverses inductive tuples
>>>
pl @ReverseTupleN (1,('a',(True,("def",()))))
Present ("def",(True,('a',(1,())))) PresentT ("def",(True,('a',(1,()))))
>>>
pl @ReverseTupleN (1,('a',()))
Present ('a',(1,())) PresentT ('a',(1,()))
>>>
pl @ReverseTupleN (999,())
Present (999,()) PresentT (999,())
Instances
(ReverseTupleC tp, Show (ReverseTupleP tp), Show tp) => P ReverseTupleN tp Source # | |
type PP ReverseTupleN tp Source # | |
Defined in Predicate |
type TupleListLax (n :: Nat) = TupleListImpl False n Source #
data TupleListImpl (strict :: Bool) (n :: Nat) Source #
Instances
(Show a, KnownNat n, GetBool strict, TupleListD (ToN n) a, Show (TupleListT (ToN n) a)) => P (TupleListImpl strict n :: Type) [a] Source # | |
type PP (TupleListImpl strict n :: Type) [a] Source # | |
Defined in Predicate |
similar to <>
>>>
pl @(Fst Id <> Snd Id) ("abc","def")
Present "abcdef" PresentT "abcdef"
>>>
pl @("abcd" <> "ef" <> Id) "ghi"
Present "abcdefghi" PresentT "abcdefghi"
data IsFixImpl (cmp :: Ordering) (ignore :: Bool) p q Source #
isInfixOf
isPrefixOf
isSuffixOf
equivalents
>>>
pl @(IsInfixI "abc" "axAbCd") ()
True TrueT
>>>
pl @(IsPrefixI "abc" "aBcbCd") ()
True TrueT
>>>
pl @(IsPrefix "abc" "aBcbCd") ()
False FalseT
>>>
pl @(IsSuffix "bCd" "aBcbCd") ()
True TrueT
prefix infix suffix for strings
type Stderr p = WritefileImpl FStderr p Source #
type Stdout p = WritefileImpl FStdout p Source #
type Writefile' (s :: Symbol) p = WritefileImpl (FOther s WFWriteForce) p Source #
type Appendfile (s :: Symbol) p = WritefileImpl (FOther s WFAppend) p Source #
data WritefileImpl (hh :: FHandle Symbol) p Source #
Instances
(GetFHandle fh, P p a, PP p a ~ String) => P (WritefileImpl fh p :: Type) a Source # | |
type PP (WritefileImpl fh p :: Type) a Source # | |
Defined in Predicate |
class GetFHandle (x :: FHandle Symbol) where Source #
Instances
GetFHandle (FStdout :: FHandle Symbol) Source # | |
GetFHandle (FStderr :: FHandle Symbol) Source # | |
(GetMode w, KnownSymbol s) => GetFHandle (FOther s w) Source # | |
data ReadEnvAll Source #
Instances
P ReadEnvAll a Source # | |
type PP ReadEnvAll a Source # | |
Defined in Predicate |
does the directory exists
>>>
pl @(DirExists ".") ()
True TrueT
does the directory exists
>>>
pl @(DirExists ".") ()
True TrueT
similar to readFile
>>>
pl @(ReadFile ".ghci" >> 'Just Id >> Len >> Gt 0) ()
True TrueT
>>>
pl @(FileExists "xyzzy") ()
False FalseT
similar to sequenceA
>>>
pl @Sequence [Just 10, Just 20, Just 30]
Present Just [10,20,30] PresentT (Just [10,20,30])
>>>
pl @Sequence [Just 10, Just 20, Just 30, Nothing, Just 40]
Present Nothing PresentT Nothing
type Case' (ps :: [k]) (qs :: [k1]) (r :: k2) = Case (Snd Id >> Failp "Case:no match") ps qs r Source #
data Case (e :: k0) (ps :: [k]) (qs :: [k1]) (r :: k2) Source #
data CaseImpl (n :: Nat) (e :: k0) (ps :: [k]) (qs :: [k1]) (r :: k2) Source #
tries each predicate ps and on the first match runs the corresponding qs but if there is no match on ps then runs the fail case e
>>>
pl @(Case (FailS "asdf" >> Snd Id >> Unproxy ) '[Lt 4,Lt 10,Same 50] '[Printf "%d is lt4" Id, Printf "%d is lt10" Id, Printf "%d is same50" Id] Id) 50
Present "50 is same50" PresentT "50 is same50"
>>>
pl @(Case (FailS "asdf" >> Snd Id >> Unproxy ) '[Lt 4,Lt 10,Same 50] '[Printf "%d is lt4" Id, Printf "%d is lt10" Id, Printf "%d is same50" Id] Id) 9
Present "9 is lt10" PresentT "9 is lt10"
>>>
pl @(Case (FailS "asdf" >> Snd Id >> Unproxy ) '[Lt 4,Lt 10,Same 50] '[Printf "%d is lt4" Id, Printf "%d is lt10" Id, Printf "%d is same50" Id] Id) 3
Present "3 is lt4" PresentT "3 is lt4"
>>>
pl @(Case (FailS "asdf" >> Snd Id >> Unproxy ) '[Lt 4,Lt 10,Same 50] '[Printf "%d is lt4" Id, Printf "%d is lt10" Id, Printf "%d is same50" Id] Id) 99
Error asdf FailT "asdf"
Instances
(KnownNat n, GetLen ps, P r x, P p (PP r x), P q (PP r x), PP p (PP r x) ~ Bool, Show (PP q (PP r x)), Show (PP r x), P (CaseImpl n e (p1 ': ps) (q1 ': qs) r) x, PP (CaseImpl n e (p1 ': ps) (q1 ': qs) r) x ~ PP q (PP r x)) => P (CaseImpl n e (p ': (p1 ': ps)) (q ': (q1 ': qs)) r :: Type) x Source # | |
(P r x, P q (PP r x), Show (PP q (PP r x)), P p (PP r x), PP p (PP r x) ~ Bool, KnownNat n, Show (PP r x), P e (PP r x, Proxy (PP q (PP r x))), PP e (PP r x, Proxy (PP q (PP r x))) ~ PP q (PP r x)) => P (CaseImpl n e (p ': ([] :: [k])) (q ': ([] :: [k1])) r :: Type) x Source # | |
(TypeError (Text "CaseImpl '[] invalid: lists are both empty") :: Constraint) => P (CaseImpl n e ([] :: [k]) ([] :: [k1]) r :: Type) x Source # | |
(TypeError (Text "CaseImpl '[] invalid: rhs requires at least one value in the list") :: Constraint) => P (CaseImpl n e (p ': ps) ([] :: [k1]) r :: Type) x Source # | |
(TypeError (Text "CaseImpl '[] invalid: lhs requires at least one value in the list") :: Constraint) => P (CaseImpl n e ([] :: [k]) (q ': qs) r :: Type) x Source # | |
type PP (CaseImpl n e (p ': (p1 ': ps)) (q ': (q1 ': qs)) r :: Type) x Source # | |
type PP (CaseImpl n e (p ': ([] :: [k])) (q ': ([] :: [k1])) r :: Type) x Source # | |
type PP (CaseImpl n e ([] :: [k]) ([] :: [k1]) r :: Type) x Source # | |
type PP (CaseImpl n e (p ': ps) ([] :: [k1]) r :: Type) x Source # | |
type PP (CaseImpl n e ([] :: [k]) (q ': qs) r :: Type) x Source # | |
type GuardsViaPara prt ps = Para (GuardsViaParaT prt ps) Source #
type family GuardsViaParaT prt ps where ... Source #
GuardsViaParaT prt '[] = '[] | |
GuardsViaParaT prt (p ': ps) = Guard prt p ': GuardsViaParaT prt ps |
data ParaImpl (n :: Nat) (strict :: Bool) (os :: [k]) Source #
runs values in parallel unlike Do
>>>
pl @(Para '[Id,Id + 1,Id * 4]) [10,20,30]
Present [10,21,120] PresentT [10,21,120]
Instances
(TypeError (Text "ParaImpl '[] invalid: requires at least one value in the list") :: Constraint) => P (ParaImpl n strict ([] :: [k]) :: Type) [a] Source # | |
(KnownNat n, GetBool strict, GetLen ps, P p a, P (ParaImpl n strict (p1 ': ps)) [a], PP (ParaImpl n strict (p1 ': ps)) [a] ~ [PP p a], Show a, Show (PP p a)) => P (ParaImpl n strict (p ': (p1 ': ps)) :: Type) [a] Source # | |
(Show (PP p a), KnownNat n, GetBool strict, Show a, P p a) => P (ParaImpl n strict (p ': ([] :: [k])) :: Type) [a] Source # | |
type PP (ParaImpl n strict (p ': (p1 ': ps)) :: Type) [a] Source # | |
type PP (ParaImpl n strict (p ': ([] :: [k])) :: Type) [a] Source # | |
type PP (ParaImpl n strict ([] :: [k]) :: Type) [a] Source # | |
uses Printf to format output
>>>
pl @(Printf "value=%03d" Id) 12
Present "value=012" PresentT "value=012"
splits string into pieces before "%" that way we have a chance of catching any errors
data Intercalate p q Source #
Intercalate
>>>
pl @(Intercalate '["aB"] '["xxxx","yz","z","www","xyz"]) ()
Present ["xxxx","aB","yz","aB","z","aB","www","aB","xyz"] PresentT ["xxxx","aB","yz","aB","z","aB","www","aB","xyz"]
type AssocL = '(I *** Fst I, Snd I >> Snd I) Source #
change associativity of nested pairs
>>>
pl @AssocL (99,('a',True))
Present ((99,'a'),True) PresentT ((99,'a'),True)
>>>
pl @AssocR ((99,'a'),True)
Present (99,('a',True)) PresentT (99,('a',True))
data ShowBase' (n :: Nat) p Source #
Display a number at base 2 to 36, similar to showIntAtBase
but supports signed numbers
>>>
pl @(ShowBase 16) 4077
Present "fed" PresentT "fed"
>>>
pl @(ShowBase 16) (-255)
Present "-ff" PresentT "-ff"
>>>
pl @(ShowBase 2) 147
Present "10010011" PresentT "10010011"
>>>
pl @(ShowBase' 2 (Negate 147)) "whatever"
Present "-10010011" PresentT "-10010011"
data ReadBase' t (n :: Nat) p Source #
Read a number base 2 via 36
>>>
pl @(ReadBase Int 16) "00feD"
Present 4077 PresentT 4077
>>>
pl @(ReadBase Int 16) "-ff"
Present -255 PresentT (-255)
>>>
pl @(ReadBase Int 2) "10010011"
Present 147 PresentT 147
supports negative numbers unlike readInt
Luhn predicate check on last digit
>>>
pl @(Luhn Id) [1,2,3,0]
True TrueT
>>>
pl @(Luhn Id) [1,2,3,4]
False FalseT
data Zip (lc :: Bool) (rc :: Bool) p q Source #
Zip two lists optionally cycling the one of the lists to match the size
>>>
pl @(Ziplc (Fst Id) (Snd Id)) ("abc", [1..5])
Present [('a',1),('b',2),('c',3),('a',4),('b',5)] PresentT [('a',1),('b',2),('c',3),('a',4),('b',5)]
>>>
pl @(Ziplc (Fst Id) (Snd Id)) ("abcdefg", [1..5])
Present [('a',1),('b',2),('c',3),('d',4),('e',5)] PresentT [('a',1),('b',2),('c',3),('d',4),('e',5)]
>>>
pl @(Ziprc (Fst Id) (Snd Id)) ("abcdefg", [1..5])
Present [('a',1),('b',2),('c',3),('d',4),('e',5),('f',1),('g',2)] PresentT [('a',1),('b',2),('c',3),('d',4),('e',5),('f',1),('g',2)]
type family ExtractAFromTA (ta :: Type) :: Type where ... Source #
ExtractAFromTA (t a) = a | |
ExtractAFromTA ta = TypeError (Text "ExtractAFromTA: expected (t a) but found something else" :$$: (Text "t a = " :<>: ShowType ta)) |
similar to align
thats pads with This
or That
if one list is shorter than the other
the key is that all information about both lists are preserved
>>>
pl @(ZipThese (Fst Id) (Snd Id)) ("aBc", [1..5])
Present [These 'a' 1,These 'B' 2,These 'c' 3,That 4,That 5] PresentT [These 'a' 1,These 'B' 2,These 'c' 3,That 4,That 5]
>>>
pl @(ZipThese (Fst Id) (Snd Id)) ("aBcDeF", [1..3])
Present [These 'a' 1,These 'B' 2,These 'c' 3,This 'D',This 'e',This 'F'] PresentT [These 'a' 1,These 'B' 2,These 'c' 3,This 'D',This 'e',This 'F']
data Char1 (s :: Symbol) Source #
extracts the first character from a non empty Symbol
>>>
pl @(Char1 "aBc") ()
Present 'a' PresentT 'a'
type Singleton p = p :+ EmptyT [] p Source #
creates a singleton from a value
>>>
pl @(Singleton (Char1 "aBc")) ()
Present "a" PresentT "a"
>>>
pl @(Singleton Id) False
Present [False] PresentT [False]
>>>
pl @(Singleton (Snd Id)) (False,"hello")
Present ["hello"] PresentT ["hello"]
data EmptyList' t Source #
creates an empty list of the given type
>>>
pl @(Id :+ EmptyList _) 99
Present [99] PresentT [99]
similar to these
>>>
pl @(TheseIn Id Len (Fst Id + Length (Snd Id))) (This 13)
Present 13 PresentT 13
>>>
pl @(TheseIn Id Len (Fst Id + Length (Snd Id))) (That "this is a long string")
Present 21 PresentT 21
>>>
pl @(TheseIn Id Len (Fst Id + Length (Snd Id))) (These 20 "somedata")
Present 28 PresentT 28
>>>
pl @(TheseIn (Left _) (Right _) (If (Fst Id > Length (Snd Id)) (MkLeft _ (Fst Id)) (MkRight _ (Snd Id)))) (That "this is a long string")
Present Right "this is a long string" PresentT (Right "this is a long string")
>>>
pl @(TheseIn (Left _) (Right _) (If (Fst Id > Length (Snd Id)) (MkLeft _ (Fst Id)) (MkRight _ (Snd Id)))) (These 1 "this is a long string")
Present Right "this is a long string" PresentT (Right "this is a long string")
>>>
pl @(TheseIn (Left _) (Right _) (If (Fst Id > Length (Snd Id)) (MkLeft _ (Fst Id)) (MkRight _ (Snd Id)))) (These 100 "this is a long string")
Present Left 100 PresentT (Left 100)
data IsTh (th :: These x y) p Source #
predicate on These
>>>
pl @(IsThis Id) (This "aBc")
True TrueT
>>>
pl @(IsThis Id) (These 1 'a')
False FalseT
>>>
pl @(IsThese Id) (These 1 'a')
True TrueT
similar to toList
>>>
pl @(ToList' Id) ("aBc" :: String)
Present "aBc" PresentT "aBc"
>>>
pl @(ToList' Id) (Just 14)
Present [14] PresentT [14]
>>>
pl @(ToList' Id) Nothing
Present [] PresentT []
>>>
pl @(ToList' Id) (Left "xx")
Present [] PresentT []
>>>
pl @(ToList' Id) (These 12 "xx")
Present ["xx"] PresentT ["xx"]
similar to toList
>>>
pl @ToList ("aBc" :: String)
Present "aBc" PresentT "aBc"
>>>
pl @ToList (Just 14)
Present [14] PresentT [14]
>>>
pl @ToList Nothing
Present [] PresentT []
>>>
pl @ToList (Left "xx")
Present [] PresentT []
>>>
pl @ToList (These 12 "xx")
Present ["xx"] PresentT ["xx"]
similar to itoList
>>>
pl @(IToList _) ("aBc" :: String)
Present [(0,'a'),(1,'B'),(2,'c')] PresentT [(0,'a'),(1,'B'),(2,'c')]
compare two strings ignoring case
>>>
pl @(Fst Id ===? Snd Id) ("abC","aBc")
Present EQ PresentT EQ
>>>
pl @(Fst Id ===? Snd Id) ("abC","DaBc")
Present LT PresentT LT
type OrdA' p q = OrdP (Fst Id >> p) (Snd Id >> q) Source #
similar to compare
>>>
pl @(Fst Id === Snd Id) (10,9)
Present GT PresentT GT
>>>
pl @(14 % 3 === Fst Id %- Snd Id) (-10,7)
Present GT PresentT GT
>>>
pl @(Fst Id === Snd Id) (10,11)
Present LT PresentT LT
>>>
pl @(Snd Id === (Fst Id >> Snd Id >> Head' Id)) (('x',[10,12,13]),10)
Present EQ PresentT EQ
>>>
pl @(Snd Id === Head' (Snd (Fst Id))) (('x',[10,12,13]),10)
Present EQ PresentT EQ
data (p :: k) ~> (q :: k1) infixr 1 Source #
implication
>>>
pl @(Fst Id ~> (Snd Id >> Len >> Ge 4)) (True,[11,12,13,14])
True TrueT
>>>
pl @(Fst Id ~> (Snd Id >> Len >> Same 4)) (True,[12,11,12,13,14])
False FalseT
>>>
pl @(Fst Id ~> (Snd Id >> Len >> Same 4)) (False,[12,11,12,13,14])
True TrueT
>>>
pl @(Fst Id ~> (Snd Id >> Len >> Ge 4)) (False,[11,12,13,14])
True TrueT
data (p :: k) || (q :: k1) infixr 2 Source #
similar to ||
>>>
pl @(Fst Id || (Snd Id >> Len >> Ge 4)) (False,[11,12,13,14])
True TrueT
>>>
pl @((Not (Fst Id)) || (Snd Id >> Len >> Same 4)) (True,[12,11,12,13,14])
False FalseT
data (p :: k) && (q :: k1) infixr 3 Source #
similar to &&
>>>
pl @(Fst Id && (Snd Id >> Len >> Ge 4)) (True,[11,12,13,14])
True TrueT
>>>
pl @(Fst Id && (Snd Id >> Len >> Same 4)) (True,[12,11,12,13,14])
False FalseT
data (p :: k) >> (q :: k1) infixr 1 Source #
This is composition for predicates
>>>
pl @(Fst Id >> Succ (Id !! 0)) ([11,12],'x')
Present 12 PresentT 12
>>>
pl @(Len *** Succ Id >> ShowP (First (Pred Id))) ([11,12],'x')
Present "(1,'y')" PresentT "(1,'y')"
just run the effect but skip the value for example for use with Stdout so it doesnt interfere with the 'a' on the rhs unless there is an error
data GuardSimple p Source #
similar to Guard
but uses the root message of the False predicate case as the failure message
>>>
pl @(GuardSimple (Luhn Id)) [1..4]
Error Luhn map=[4,6,2,2] sum=14 ret=4 | [1,2,3,4] FailT "Luhn map=[4,6,2,2] sum=14 ret=4 | [1,2,3,4]"
>>>
pl @(GuardSimple (Luhn Id)) [1,2,3,0]
Present [1,2,3,0] PresentT [1,2,3,0]
>>>
pl @(GuardSimple (Len > 30)) [1,2,3,0]
Error 4 > 30 FailT "4 > 30"
'p' is the predicate and on failure of the predicate runs 'prt'
>>>
pl @(Guard "expected > 3" (Gt 3)) 17
Present 17 PresentT 17
>>>
pl @(Guard "expected > 3" (Gt 3)) 1
Error expected > 3 FailT "expected > 3"
>>>
pl @(Guard (Printf "%d not > 3" Id) (Gt 3)) (-99)
Error -99 not > 3 FailT "-99 not > 3"
data GuardsImplW (strict :: Bool) (ps :: [(k, k1)]) Source #
type GuardsQuick (prt :: k) (os :: [k1]) = Guards (ToGuardsT prt os) Source #
type GuardsLax (os :: [(k, k1)]) = GuardsImplW False os Source #
type Guards (os :: [(k, k1)]) = GuardsImplW True os Source #
data GuardsImpl (n :: Nat) (strict :: Bool) (os :: [(k, k1)]) Source #
Guards contain a type level list of tuples the action to run on failure of the predicate and the predicate itself Each tuple validating against the corresponding value in a value list
>>>
pl @(Guards '[ '("arg1 failed",Gt 4), '("arg2 failed", Same 4)]) [17,4]
Present [17,4] PresentT [17,4]
>>>
pl @(Guards '[ '("arg1 failed",Gt 4), '("arg2 failed", Same 5)]) [17,4]
Error arg2 failed FailT "arg2 failed"
>>>
pl @(Guards '[ '("arg1 failed",Gt 99), '("arg2 failed", Same 4)]) [17,4]
Error arg1 failed FailT "arg1 failed"
>>>
pl @(Guards '[ '(Printf2 "arg %d failed with value %d",Gt 4), '(Printf2 "%d %d", Same 4)]) [17,3]
Error 2 3 FailT "2 3"
>>>
pl @(GuardsQuick (Printf2 "arg %d failed with value %d") '[Gt 4, Ge 3, Same 4]) [17,3,5]
Error arg 3 failed with value 5 FailT "arg 3 failed with value 5"
>>>
pl @(GuardsQuick (Printf2 "arg %d failed with value %d") '[Gt 4, Ge 3, Same 4]) [17,3,5,99]
Error Guards: data elements(4) /= predicates(3) FailT "Guards: data elements(4) /= predicates(3)"
Instances
(KnownNat n, GetBool strict, Show a) => P (GuardsImpl n strict ([] :: [(k, k1)]) :: Type) [a] Source # | |
(PP prt (Int, a) ~ String, P prt (Int, a), KnownNat n, GetBool strict, GetLen ps, P p a, PP p a ~ Bool, P (GuardsImpl n strict ps) [a], PP (GuardsImpl n strict ps) [a] ~ [a], Show a) => P (GuardsImpl n strict ((,) prt p ': ps) :: Type) [a] Source # | |
type PP (GuardsImpl n strict ((,) prt p ': ps) :: Type) [a] Source # | |
Defined in Predicate | |
type PP (GuardsImpl n strict ([] :: [(k, k1)]) :: Type) [a] Source # | |
Defined in Predicate |
type OneP = Guard (Printf "expected list of length 1 but found length=%d" Len) (Len >> Same 1) >> Head Source #
similar to quotRem
>>>
pl @(QuotRem (Fst Id) (Snd Id)) (10,3)
Present (3,1) PresentT (3,1)
>>>
pl @(QuotRem (Fst Id) (Snd Id)) (10,-3)
Present (-3,1) PresentT (-3,1)
>>>
pl @(QuotRem (Fst Id) (Snd Id)) (-10,-3)
Present (3,-1) PresentT (3,-1)
>>>
pl @(QuotRem (Fst Id) (Snd Id)) (-10,3)
Present (-3,-1) PresentT (-3,-1)
>>>
pl @(QuotRem (Fst Id) (Snd Id)) (10,0)
Error QuotRem zero denominator FailT "QuotRem zero denominator"
similar to divMod
>>>
pl @(DivMod (Fst Id) (Snd Id)) (10,3)
Present (3,1) PresentT (3,1)
>>>
pl @(DivMod (Fst Id) (Snd Id)) (10,-3)
Present (-4,-2) PresentT (-4,-2)
>>>
pl @(DivMod (Fst Id) (Snd Id)) (-10,3)
Present (-4,2) PresentT (-4,2)
>>>
pl @(DivMod (Fst Id) (Snd Id)) (-10,-3)
Present (3,-1) PresentT (3,-1)
>>>
pl @(DivMod (Fst Id) (Snd Id)) (10,0)
Error DivMod zero denominator FailT "DivMod zero denominator"
similar to mod
>>>
pl @(Mod (Fst Id) (Snd Id)) (10,3)
Present 1 PresentT 1
>>>
pl @(Mod (Fst Id) (Snd Id)) (10,0)
Error Mod zero denominator FailT "Mod zero denominator"
similar to div
>>>
pl @(Div (Fst Id) (Snd Id)) (10,4)
Present 2 PresentT 2
>>>
pl @(Div (Fst Id) (Snd Id)) (10,0)
Error Div zero denominator FailT "Div zero denominator"
catch a failure
>>>
pl @(Catch (Succ Id) (Fst Id >> Second (ShowP Id) >> Printf2 "%s %s" >> 'LT)) GT
Present LT PresentT LT
>>>
pl @(Catch' (Succ Id) (Second (ShowP Id) >> Printf2 "%s %s")) GT
Error Succ IO e=Prelude.Enum.Ordering.succ: bad argument GT FailT "Succ IO e=Prelude.Enum.Ordering.succ: bad argument GT"
>>>
pl @(Catch' (Succ Id) (Second (ShowP Id) >> Printf2 "%s %s")) LT
Present EQ PresentT EQ
more flexible: takes a (String,x) and a proxy so we can still call 'False 'True now takes the FailT string and x so you can print more detail if you want need the proxy so we can fail without having to explicitly specify a type
Fails the computation with a message
>>>
pl @(Failt Int (Printf "value=%03d" Id)) 99
Error value=099 FailT "value=099"
>>>
pl @(FailS (Printf2 "value=%03d string=%s")) (99,"somedata")
Error value=099 string=somedata FailT "value=099 string=somedata"
similar to break
>>>
pl @(Break (Ge 3) Id) [10,4,1,7,3,1,3,5]
Present ([],[10,4,1,7,3,1,3,5]) PresentT ([],[10,4,1,7,3,1,3,5])
>>>
pl @(Break (Lt 3) Id) [10,4,1,7,3,1,3,5]
Present ([10,4],[1,7,3,1,3,5]) PresentT ([10,4],[1,7,3,1,3,5])
similar to partition
>>>
pl @(Partition (Ge 3) Id) [10,4,1,7,3,1,3,5]
Present ([10,4,7,3,3,5],[1,1]) PresentT ([10,4,7,3,3,5],[1,1])
>>>
pl @(Partition (Prime Id) Id) [10,4,1,7,3,1,3,5]
Present ([7,3,3,5],[10,4,1,1]) PresentT ([7,3,3,5],[10,4,1,1])
>>>
pl @(Partition (Ge 300) Id) [10,4,1,7,3,1,3,5]
Present ([],[10,4,1,7,3,1,3,5]) PresentT ([],[10,4,1,7,3,1,3,5])
>>>
pl @(Partition (Id < 300) Id) [10,4,1,7,3,1,3,5]
Present ([10,4,1,7,3,1,3,5],[]) PresentT ([10,4,1,7,3,1,3,5],[])
creates a list of overlapping pairs of elements. requires two or more elements
>>>
pl @Pairs [1,2,3,4]
Present [(1,2),(2,3),(3,4)] PresentT [(1,2),(2,3),(3,4)]
>>>
pl @Pairs []
Error Pairs no data found FailT "Pairs no data found"
>>>
pl @Pairs [1]
Error Pairs only one element found FailT "Pairs only one element found"
if p then run q else run r
>>>
pl @(If (Gt 4) "greater than 4" "less than or equal to 4" ) 10
Present "greater than 4" PresentT "greater than 4"
>>>
pl @(If (Gt 4) "greater than 4" "less than or equal to 4") 0
Present "less than or equal to 4" PresentT "less than or equal to 4"
similar to map
>>>
pl @(Map (Pred Id) Id) [1..5]
Present [0,1,2,3,4] PresentT [0,1,2,3,4]
type IterateNUntil n p f = IterateNWhile n (Not p) f Source #
type IterateNWhile n p f = '(n, Id) >> (IterateWhile ((Fst Id > 0) && (Snd Id >> p)) (Pred Id *** f) >> Map (Snd Id) Id) Source #
type IterateUntil p f = IterateWhile (Not p) f Source #
similar to unfoldr
>>>
pl @(Unfoldr (MaybeB (Not Null) (SplitAt 2 Id)) Id) [1..5]
Present [[1,2],[3,4],[5]] PresentT [[1,2],[3,4],[5]]
>>>
pl @(IterateN 4 (Succ Id)) 4
Present [4,5,6,7] PresentT [4,5,6,7]
similar to scanl
>>>
pl @(Scanl (Snd Id :+ Fst Id) (Fst Id) (Snd Id)) ([99],[1..5])
Present [[99],[1,99],[2,1,99],[3,2,1,99],[4,3,2,1,99],[5,4,3,2,1,99]] PresentT [[99],[1,99],[2,1,99],[3,2,1,99],[4,3,2,1,99],[5,4,3,2,1,99]]
>>>
pl @(ScanN 4 Id (Succ Id)) 'c'
Present "cdefg" PresentT "cdefg"
>>>
pl @(FoldN 4 Id (Succ Id)) 'c'
Present 'g' PresentT 'g'
data PartitionThese Source #
similar to partitionThese
. returns a 3-tuple with the results so use Fst
Snd
Thd
to extract
>>>
pl @PartitionThese [This 'a', That 2, This 'c', These 'z' 1, That 4, These 'a' 2, That 99]
Present ("ac",[2,4,99],[('z',1),('a',2)]) PresentT ("ac",[2,4,99],[('z',1),('a',2)])
data PartitionEithers Source #
similar to partitionEithers
>>>
pl @PartitionEithers [Left 'a',Right 2,Left 'c',Right 4,Right 99]
Present ("ac",[2,4,99]) PresentT ("ac",[2,4,99])
data EnumFromTo p q Source #
similar to enumFromTo
>>>
pl @(EnumFromTo 2 5) ()
Present [2,3,4,5] PresentT [2,3,4,5]
>>>
pl @(EnumFromTo LT GT) ()
Present [LT,EQ,GT] PresentT [LT,EQ,GT]
>>>
pl @IsEmpty [1,2,3,4]
False FalseT
>>>
pl @IsEmpty []
True TrueT
>>>
pl @IsEmpty LT
False FalseT
>>>
pl @IsEmpty EQ
True TrueT
>>>
pl @Unsnoc [1,2,3,4]
Present Just ([1,2,3],4) PresentT (Just ([1,2,3],4))
>>>
pl @Unsnoc []
Present Nothing PresentT Nothing
>>>
pl @Uncons [1,2,3,4]
Present Just (1,[2,3,4]) PresentT (Just (1,[2,3,4]))
>>>
pl @Uncons []
Present Nothing PresentT Nothing
similar to snoc
>>>
pl @(Snd Id +: Fst Id) (99,[1,2,3,4])
Present [1,2,3,4,99] PresentT [1,2,3,4,99]
>>>
pl @(Fst Id +: Snd Id) ([],5)
Present [5] PresentT [5]
>>>
pl @(EmptyT [] Id +: 5) 5
Present [5] PresentT [5]
similar to cons
>>>
pl @(Fst Id :+ Snd Id) (99,[1,2,3,4])
Present [99,1,2,3,4] PresentT [99,1,2,3,4]
>>>
pl @(Snd Id :+ Fst Id) ([],5)
Present [5] PresentT [5]
>>>
pl @(123 :+ EmptyList _) "somestuff"
Present [123] PresentT [123]
>>>
pl @(Ors Id) [False,False,False]
False FalseT
>>>
pl @(Ors Id) [True,True,True,False]
True TrueT
>>>
pl @(Ors Id) []
False FalseT
>>>
pl @(Ands Id) [True,True,True]
True TrueT
>>>
pl @(Ands Id) [True,True,True,False]
False FalseT
>>>
pl @(Ands Id) []
True TrueT
type Lookup' (t :: Type) p q = (q &&& Lookup p q) >> If (Snd Id >> IsNothing) (ShowP (Fst Id) >> Fail (Hole t) (Printf "index(%s) not found" Id)) (Snd Id >> Just Id) Source #
>>>
import qualified Data.Map.Strict as M
>>>
pl @(Id !!! 2) ["abc","D","eF","","G"]
Present "eF" PresentT "eF"
>>>
pl @(Id !!! 20) ["abc","D","eF","","G"]
Error index not found FailT "index not found"
>>>
pl @(Id !!! "eF") (M.fromList (flip zip [0..] ["abc","D","eF","","G"]))
Present 2 PresentT 2
>>>
pl @(Lookup Id 2) ["abc","D","eF","","G"]
Present Just "eF" PresentT (Just "eF")
>>>
pl @(Lookup Id 20) ["abc","D","eF","","G"]
Present Nothing PresentT Nothing
>>>
import qualified Data.Map.Strict as M
>>>
pl @(Id !! 2) ["abc","D","eF","","G"]
Present "eF" PresentT "eF"
>>>
pl @(Id !! 20) ["abc","D","eF","","G"]
Error (!!) index not found FailT "(!!) index not found"
>>>
pl @(Id !! "eF") (M.fromList (flip zip [0..] ["abc","D","eF","","G"]))
Present 2 PresentT 2
data Ix (n :: Nat) def Source #
similar to !!
>>>
pl @(Ix 4 "not found") ["abc","D","eF","","G"]
Present "G" PresentT "G"
>>>
pl @(Ix 40 "not found") ["abc","D","eF","","G"]
Present "not found" PresentT "not found"
similar to concat
>>>
pl @(Concat Id) ["abc","D","eF","","G"]
Present "abcDeFG" PresentT "abcDeFG"
>>>
pl @(Concat (Snd Id)) ('x',["abc","D","eF","","G"])
Present "abcDeFG" PresentT "abcDeFG"
type FoldMap (t :: Type) p = Map (Wrap t Id) p >> Unwrap (MConcat Id) Source #
similar to a limited form of foldMap
>>>
pl @(FoldMap (SG.Sum _) Id) [44, 12, 3]
Present 59 PresentT 59
>>>
pl @(FoldMap (SG.Product _) Id) [44, 12, 3]
Present 1584 PresentT 1584
similar to mconcat
>>>
pl @(MConcat Id) [SG.Sum 44, SG.Sum 12, SG.Sum 3]
Present Sum {getSum = 59} PresentT (Sum {getSum = 59})
These
constructor
>>>
pl @(MkThese (Fst Id) (Snd Id)) (44,'x')
Present These 44 'x' PresentT (These 44 'x')
That
constructor
>>>
pl @(MkThat _ Id) 44
Present That 44 PresentT (That 44)
This
constructor
>>>
pl @(MkThis _ Id) 44
Present This 44 PresentT (This 44)
Right
constructor
>>>
pl @(MkRight _ Id) 44
Present Right 44 PresentT (Right 44)
Left
constructor
>>>
pl @(MkLeft _ Id) 44
Present Left 44 PresentT (Left 44)
Just
constructor
>>>
pl @(MkJust Id) 44
Present Just 44 PresentT (Just 44)
data MkNothing' t Source #
Instances
P (MkNothing' t :: Type) a Source # | |
type PP (MkNothing' t :: Type) a Source # | |
data EmptyT (t :: Type -> Type) p Source #
similar to empty
>>>
pl @(EmptyT Maybe Id) ()
Present Nothing PresentT Nothing
>>>
pl @(EmptyT [] Id) ()
Present [] PresentT []
>>>
pl @(EmptyT [] (Char1 "x")) (13,True)
Present "" PresentT ""
>>>
pl @(EmptyT (Either String) (Fst Id)) (13,True)
Present Left "" PresentT (Left "")
data MEmptyProxy Source #
similar to mempty
>>>
pl @(MEmptyT (SG.Sum Int)) ()
Present Sum {getSum = 0} PresentT (Sum {getSum = 0})
no Monoid for Maybe a unless a is also a monoid but can use empty!
data Pure (t :: Type -> Type) p Source #
similar to pure
>>>
pl @(Pure Maybe Id) 4
Present Just 4 PresentT (Just 4)
>>>
pl @(Pure [] Id) 4
Present [4] PresentT [4]
>>>
pl @(Pure (Either String) (Fst Id)) (13,True)
Present Right 13 PresentT (Right 13)
similar to stimes
>>>
pl @(STimes 4 Id) (SG.Sum 3)
Present Sum {getSum = 12} PresentT (Sum {getSum = 12})
>>>
pl @(STimes 4 Id) "ab"
Present "abababab" PresentT "abababab"
similar to maybe
similar to MaybeX
but provides a Proxy to the result of 'q' and does not provide the surrounding context
>>>
pl @(MaybeIn "foundnothing" (ShowP (Pred Id))) (Just 20)
Present "19" PresentT "19"
>>>
pl @(MaybeIn "found nothing" (ShowP (Pred Id))) Nothing
Present "found nothing" PresentT "found nothing"
similar to mergeTheseWith
but additionally provides 'p', '\q' and 'r' the original input as the first element in the tuple
>>>
pl @(TheseX (((Fst Id >> Fst Id) + Snd Id) >> ShowP Id) (ShowP Id) (Snd (Snd Id)) (Snd Id)) (9,This 123)
Present "132" PresentT "132"
>>>
pl @(TheseX '(Snd Id,"fromthis") '(Negate 99,Snd Id) (Snd Id) Id) (This 123)
Present (123,"fromthis") PresentT (123,"fromthis")
>>>
pl @(TheseX '(Snd Id,"fromthis") '(Negate 99,Snd Id) (Snd Id) Id) (That "fromthat")
Present (-99,"fromthat") PresentT (-99,"fromthat")
>>>
pl @(TheseX '(Snd Id,"fromthis") '(Negate 99,Snd Id) (Snd Id) Id) (These 123 "fromthese")
Present (123,"fromthese") PresentT (123,"fromthese")
similar to |||
but additionally gives 'p' and 'q' the original input
>>>
pl @(EitherX (ShowP (Fst (Fst Id) + Snd Id)) (ShowP Id) (Snd Id)) (9,Left 123)
Present "132" PresentT "132"
>>>
pl @(EitherX (ShowP (Fst (Fst Id) + Snd Id)) (ShowP Id) (Snd Id)) (9,Right 'x')
Present "((9,Right 'x'),'x')" PresentT "((9,Right 'x'),'x')"
>>>
pl @(EitherX (ShowP Id) (ShowP (Second (Succ Id))) (Snd Id)) (9,Right 'x')
Present "((9,Right 'x'),'y')" PresentT "((9,Right 'x'),'y')"
data TheseToMaybe Source #
data ThatToMaybe Source #
data ThisToMaybe Source #
data RightToMaybe Source #
similar to either (const Nothing) Just
>>>
pl @RightToMaybe (Right 13)
Present Just 13 PresentT (Just 13)
>>>
pl @RightToMaybe (Left 13)
Present Nothing PresentT Nothing
data LeftToMaybe Source #
similar to either Just (const Nothing)
>>>
pl @LeftToMaybe (Left 13)
Present Just 13 PresentT (Just 13)
>>>
pl @LeftToMaybe (Right 13)
Present Nothing PresentT Nothing
type TheseFail msg q = GFail TheseToMaybe msg q Source #
type TheseP q = GProxy TheseToMaybe q Source #
type TheseDef p q = GDef TheseToMaybe p q Source #
type ThatFail msg q = GFail ThatToMaybe msg q Source #
type ThatP q = GProxy ThatToMaybe q Source #
type ThatDef p q = GDef ThatToMaybe p q Source #
type ThisFail msg q = GFail ThisToMaybe msg q Source #
type ThisP q = GProxy ThisToMaybe q Source #
type ThisDef p q = GDef ThisToMaybe p q Source #
type RightFail msg q = GFail RightToMaybe msg q Source #
type RightP q = GProxy RightToMaybe q Source #
type RightDef p q = GDef RightToMaybe p q Source #
type LeftFail msg q = GFail LeftToMaybe msg q Source #
type LeftP q = GProxy LeftToMaybe q Source #
type LeftDef p q = GDef LeftToMaybe p q Source #
type LookupFail msg x y = LookupFail' msg x y I Source #
type LookupDef x y p = LookupDef' x y p I Source #
type LookupFail' msg x y q = GFail (Lookup x y) msg q Source #
type LookupDef' x y p q = GDef (Lookup x y) p q Source #
type JustDef''' p q r = GDef_X I p q r Source #
similar to fmap snd
>>>
pl @Fmap_2 (Just ("asf",13))
Present Just 13 PresentT (Just 13)
similar to fmap fst
>>>
pl @Fmap_1 (Just (13,"Asf"))
Present Just 13 PresentT (Just 13)
to make this work we grab the fst or snd out of the Maybe so it is a head or not/ is a tail or not etc! we still have access to the whole original list so we dont lose anything!
elem
function
>>>
pl @(Elem (Fst Id) (Snd Id)) ('x',"abcdxy")
True TrueT
>>>
pl @(Elem (Fst Id) (Snd Id)) ('z',"abcdxy")
False FalseT
data KeepImpl (keep :: Bool) p q Source #
filters a list 'q' keeping or removing those elements in 'p'
>>>
pl @(Keep '[5] '[1,5,5,2,5,2]) ()
Present [5,5,5] PresentT [5,5,5]
>>>
pl @(Keep '[0,1,1,5] '[1,5,5,2,5,2]) ()
Present [1,5,5,5] PresentT [1,5,5,5]
>>>
pl @(Remove '[5] '[1,5,5,2,5,2]) ()
Present [1,2,2] PresentT [1,2,2]
>>>
pl @(Remove '[0,1,1,5] '[1,5,5,2,5,2]) ()
Present [2,2] PresentT [2,2]
>>>
pl @(Remove '[99] '[1,5,5,2,5,2]) ()
Present [1,5,5,2,5,2] PresentT [1,5,5,2,5,2]
>>>
pl @(Remove '[99,91] '[1,5,5,2,5,2]) ()
Present [1,5,5,2,5,2] PresentT [1,5,5,2,5,2]
>>>
pl @(Remove Id '[1,5,5,2,5,2]) []
Present [1,5,5,2,5,2] PresentT [1,5,5,2,5,2]
>>>
pl @(Remove '[] '[1,5,5,2,5,2]) 44 -- works if you make this a number!
Present [1,5,5,2,5,2] PresentT [1,5,5,2,5,2]
not
function
>>>
pl @(Not Id) False
True TrueT
>>>
pl @(Not Id) True
False FalseT
>>>
pl @(Not (Fst Id)) (True,22)
False FalseT
a predicate on prime numbers
>>>
pl @(Prime Id) 2
True TrueT
>>>
pl @(Map '(Id,Prime Id) Id) [0..12]
Present [(0,False),(1,False),(2,True),(3,True),(4,False),(5,True),(6,False),(7,True),(8,False),(9,False),(10,False),(11,True),(12,False)] PresentT [(0,False),(1,False),(2,True),(3,True),(4,False),(5,True),(6,False),(7,True),(8,False),(9,False),(10,False),(11,True),(12,False)]
bounded toEnum
function
>>>
pl @(ToEnumB Ordering LT) 2
Present GT PresentT GT
>>>
pl @(ToEnumB Ordering LT) 6
Present LT PresentT LT
>>>
pl @(ToEnumBF Ordering) 6
Error ToEnum bounded failed FailT "ToEnum bounded failed"
unsafe toEnum
function
>>>
pl @(ToEnum Char Id) 120
Present 'x' PresentT 'x'
fromEnum
function
>>>
pl @(FromEnum Id) 'x'
Present 120 PresentT 120
unbounded pred
function
>>>
pl @(Pred Id) 13
Present 12 PresentT 12
>>>
pl @(Pred Id) LT
Error Pred IO e=Prelude.Enum.Ordering.pred: bad argument FailT "Pred IO e=Prelude.Enum.Ordering.pred: bad argument"
unbounded succ
function
>>>
pl @(Succ Id) 13
Present 14 PresentT 14
>>>
pl @(Succ Id) LT
Present EQ PresentT EQ
>>>
pl @(Succ Id) GT
Error Succ IO e=Prelude.Enum.Ordering.succ: bad argument FailT "Succ IO e=Prelude.Enum.Ordering.succ: bad argument"
bounded pred
function
>>>
pl @(PredB' Id) (13 :: Int)
Present 12 PresentT 12
>>>
pl @(PredB' Id) LT
Error Pred bounded failed FailT "Pred bounded failed"
bounded succ
function
>>>
pl @(SuccB' Id) (13 :: Int)
Present 14 PresentT 14
>>>
pl @(SuccB' Id) LT
Present EQ PresentT EQ
>>>
pl @(SuccB 'LT Id) GT
Present LT PresentT LT
>>>
pl @(SuccB' Id) GT
Error Succ bounded failed FailT "Succ bounded failed"
swaps using swapped
>>>
pl @Swap (Left 123)
Present Right 123 PresentT (Right 123)
>>>
pl @Swap (Right 123)
Present Left 123 PresentT (Left 123)
>>>
pl @Swap (These 'x' 123)
Present These 123 'x' PresentT (These 123 'x')
>>>
pl @Swap (This 'x')
Present That 'x' PresentT (That 'x')
>>>
pl @Swap (That 123)
Present This 123 PresentT (This 123)
>>>
pl @Swap (123,'x')
Present ('x',123) PresentT ('x',123)
>>>
pl @Swap (Left "abc")
Present Right "abc" PresentT (Right "abc")
>>>
pl @Swap (Right 123)
Present Left 123 PresentT (Left 123)
reverses using reversing
>>>
import Data.Text (Text)
>>>
pl @ReverseL ("AbcDeF" :: Text)
Present "FeDcbA" PresentT "FeDcbA"
>>>
pl @ReverseL ("AbcDeF" :: String)
Present "FeDcbA" PresentT "FeDcbA"
similar to reverse
>>>
pl @Reverse [1,2,4]
Present [4,2,1] PresentT [4,2,1]
>>>
pl @Reverse "AbcDeF"
Present "FeDcbA" PresentT "FeDcbA"
data Pure2 (t :: Type -> Type) Source #
lift pure over a Functor
>>>
pl @(Pure2 (Either String)) [1,2,4]
Present [Right 1,Right 2,Right 4] PresentT [Right 1,Right 2,Right 4]
lift mempty over a Functor
>>>
pl @(MEmptyT2 (SG.Product Int)) [Identity (-13), Identity 4, Identity 99]
Present [Product {getProduct = 1},Product {getProduct = 1},Product {getProduct = 1}] PresentT [Product {getProduct = 1},Product {getProduct = 1},Product {getProduct = 1}]
data Coerce2 (t :: k) Source #
see Coerce
: coerce over a functor
>>>
pl @(Coerce2 (SG.Sum Integer)) [Identity (-13), Identity 4, Identity 99]
Present [Sum {getSum = -13},Sum {getSum = 4},Sum {getSum = 99}] PresentT [Sum {getSum = -13},Sum {getSum = 4},Sum {getSum = 99}]
>>>
pl @(Coerce2 (SG.Sum Integer)) (Just (Identity (-13)))
Present Just (Sum {getSum = -13}) PresentT (Just (Sum {getSum = -13}))
>>>
pl @(Coerce2 (SG.Sum Int)) (Nothing @(Identity Int))
Present Nothing PresentT Nothing
similar to coerce
>>>
pl @(Coerce (SG.Sum Integer)) (Identity (-13))
Present Sum {getSum = -13} PresentT (Sum {getSum = -13})
wraps a value (see Wrapped
and Wrapped
)
>>>
:m + Data.List.NonEmpty
>>>
pl @(Wrap (SG.Sum _) Id) (-13)
Present Sum {getSum = -13} PresentT (Sum {getSum = -13})
>>>
pl @(Wrap SG.Any (Ge 4)) 13
Present Any {getAny = True} PresentT (Any {getAny = True})
>>>
pl @(Wrap (NonEmpty _) (Uncons >> 'Just Id)) "abcd"
Present 'a' :| "bcd" PresentT ('a' :| "bcd")
unwraps a value (see Wrapped
)
>>>
pl @(Unwrap Id) (SG.Sum (-13))
Present -13 PresentT (-13)
similar to signum
>>>
pl @(Signum Id) (-14)
Present -1 PresentT (-1)
>>>
pl @(Signum Id) 14
Present 1 PresentT 1
>>>
pl @(Signum Id) 0
Present 0 PresentT 0
similar to abs
>>>
pl @(Abs Id) (-14)
Present 14 PresentT 14
>>>
pl @(Abs (Snd Id)) ("xx",14)
Present 14 PresentT 14
>>>
pl @(Abs Id) 0
Present 0 PresentT 0
>>>
pl @(Abs (Negate 44)) "aaa"
Present 44 PresentT 44
similar to negate
>>>
pl @(Negate Id) 14
Present -14 PresentT (-14)
>>>
pl @(Negate (Fst Id * Snd Id)) (14,3)
Present -42 PresentT (-42)
>>>
pl @(Negate (15 %- 4)) "abc"
Present 15 % 4 PresentT (15 % 4)
>>>
pl @(Negate (15 % 3)) ()
Present (-5) % 1 PresentT ((-5) % 1)
>>>
pl @(Negate (Fst Id % Snd Id)) (14,3)
Present (-14) % 3 PresentT ((-14) % 3)
creates a Rational
value
>>>
pl @(Id < 21 % 5) (-3.1)
True TrueT
>>>
pl @(Id < 21 % 5) 4.5
False FalseT
>>>
pl @(Fst Id % Snd Id) (13,2)
Present 13 % 2 PresentT (13 % 2)
>>>
pl @(13 % Id) 0
Error MkRatio zero denominator FailT "MkRatio zero denominator"
>>>
pl @(4 % 3 + 5 % 7) "asfd"
Present 43 % 21 PresentT (43 % 21)
>>>
pl @(4 %- 7 * 5 %- 3) "asfd"
Present 20 % 21 PresentT (20 % 21)
>>>
pl @(Negate (14 % 3)) ()
Present (-14) % 3 PresentT ((-14) % 3)
>>>
pl @(14 % 3) ()
Present 14 % 3 PresentT (14 % 3)
>>>
pl @(Negate (14 % 3) === FromIntegral _ (Negate 5)) ()
Present GT PresentT GT
>>>
pl @(14 -% 3 === 5 %- 1) "aa"
Present GT PresentT GT
>>>
pl @(Negate (14 % 3) === Negate 5 % 2) ()
Present LT PresentT LT
>>>
pl @(14 -% 3 * 5 -% 1) ()
Present 70 % 3 PresentT (70 % 3)
>>>
pl @(14 % 3 === 5 % 1) ()
Present LT PresentT LT
>>>
pl @(15 % 3 / 4 % 2) ()
Present 5 % 2 PresentT (5 % 2)
fractional division
>>>
pl @(Fst Id / Snd Id) (13,2)
Present 6.5 PresentT 6.5
>>>
pl @(ToRational 13 / Id) 0
Error DivF zero denominator FailT "DivF zero denominator"
data Bin (op :: BinOp) p q Source #
addition, multiplication and subtraction
>>>
pl @(Fst Id * Snd Id) (13,5)
Present 65 PresentT 65
>>>
pl @(Fst Id + 4 * (Snd Id >> Len) - 4) (3,"hello")
Present 19 PresentT 19
data (p :: k) +++ (q :: k1) infixr 2 Source #
similar +++
>>>
pl @(Pred Id +++ Id) (Left 13)
Present Left 12 PresentT (Left 12)
>>>
pl @(ShowP Id +++ Reverse) (Right "hello")
Present Right "olleh" PresentT (Right "olleh")
data (p :: k) ||| (q :: k1) infixr 2 Source #
similar |||
>>>
pl @(Pred Id ||| Id) (Left 13)
Present 12 PresentT 12
>>>
pl @(ShowP Id ||| Id) (Right "hello")
Present "hello" PresentT "hello"
data (p :: k) *** (q :: k1) infixr 3 Source #
similar to ***
>>>
pl @(Pred Id *** ShowP Id) (13, True)
Present (12,"True") PresentT (12,"True")
similar to splitAt
>>>
pl @(SplitAt 4 Id) "hello world"
Present ("hell","o world") PresentT ("hell","o world")
>>>
pl @(SplitAt 20 Id) "hello world"
Present ("hello world","") PresentT ("hello world","")
>>>
pl @(SplitAt 0 Id) "hello world"
Present ("","hello world") PresentT ("","hello world")
>>>
pl @(SplitAt (Snd Id) (Fst Id)) ("hello world",4)
Present ("hell","o world") PresentT ("hell","o world")
split a list 'p' into parts using the lengths in the type level list 'ns'
>>>
pl @(SplitAts '[2,3,1,1] Id) "hello world"
Present ["he","llo"," ","w","orld"] PresentT ["he","llo"," ","w","orld"]
>>>
pl @(SplitAts '[2] Id) "hello world"
Present ["he","llo world"] PresentT ["he","llo world"]
>>>
pl @(SplitAts '[10,1,1,5] Id) "hello world"
Present ["hello worl","d","",""] PresentT ["hello worl","d","",""]
data Pad (left :: Bool) n p q Source #
pad 'q' with '\n' values from '\p'\
>>>
pl @(PadL 5 999 Id) [12,13]
Present [999,999,999,12,13] PresentT [999,999,999,12,13]
>>>
pl @(PadR 5 (Fst Id) '[12,13]) (999,'x')
Present [12,13,999,999,999] PresentT [12,13,999,999,999]
>>>
pl @(PadR 2 (Fst Id) '[12,13,14]) (999,'x')
Present [12,13,14] PresentT [12,13,14]
data TupleI (ps :: [k]) Source #
create inductive tuples from a type level list of predicates
>>>
pl @(TupleI '[Id,ShowP Id,Pred Id,W "str", W 999]) 666
Present (666,("666",(665,("str",(999,()))))) PresentT (666,("666",(665,("str",(999,())))))
>>>
pl @(TupleI '[W 999,W "somestring",W 'True, Id, ShowP (Pred Id)]) 23
Present (999,("somestring",(True,(23,("22",()))))) PresentT (999,("somestring",(True,(23,("22",())))))
Convenient method to convert a 'p' or '\q' to a Either
based on a predicate '\b\'
if 'b' then Right 'p' else Left '\q\'
>>>
pl @(EitherB (Fst Id > 4) (Snd Id >> Fst Id) (Snd Id >> Snd Id)) (24,(-1,999))
Present Right 999 PresentT (Right 999)
>>>
pl @(EitherB (Fst Id > 4) (Snd Id >> Fst Id) (Snd Id >> Snd Id)) (1,(-1,999))
Present Left (-1) PresentT (Left (-1))
Convenient method to convert a value 'p' to a Maybe
based on a predicate '\b\'
if '\b\' then Just 'p' else Nothing
>>>
pl @(MaybeB (Id > 4) Id) 24
Present Just 24 PresentT (Just 24)
>>>
pl @(MaybeB (Id > 4) Id) (-5)
Present Nothing PresentT Nothing
processes a type level list predicates running each in sequence: see >>
>>>
pl @(Do [Pred Id, ShowP Id, Id &&& Len]) 9876543
Present ("9876542",7) PresentT ("9876542",7)
>>>
pl @(Do '[W 123, W "xyz", Len &&& Id, Pred Id *** Id<>Id]) ()
Present (2,"xyzxyz") PresentT (2,"xyzxyz")
converts a value to a Proxy
: the same as '\'Proxy'
>>>
pl @MkProxy 'x'
Present Proxy PresentT Proxy
floor
function where you need to provide the type 't' of the result
>>>
pl @(Floor Int Id) (23 % 5)
Present 4 PresentT 4
ceiling
function where you need to provide the type 't' of the result
>>>
pl @(Ceiling Int Id) (23 % 5)
Present 5 PresentT 5
truncate
function where you need to provide the type 't' of the result
>>>
pl @(Truncate Int Id) (23 % 5)
Present 4 PresentT 4
type FromRational (t :: Type) p = FromRational' (Hole t) p Source #
data FromRational' t r Source #
fromRational
function where you need to provide the type 't' of the result
>>>
pl @(FromRational Rational Id) 23.5
Present 47 % 2 PresentT (47 % 2)
data ToRational p Source #
toRational
function
>>>
pl @(ToRational Id) 23.5
Present 47 % 2 PresentT (47 % 2)
type FromIntegral (t :: Type) p = FromIntegral' (Hole t) p Source #
data FromIntegral' t n Source #
fromIntegral
function where you need to provide the type 't' of the result
>>>
pl @(FromIntegral (SG.Sum _) Id) 23
Present Sum {getSum = 23} PresentT (Sum {getSum = 23})
type FromIntegerP n = FromInteger' Unproxy n Source #
type FromInteger (t :: Type) p = FromInteger' (Hole t) p Source #
data FromInteger' t n Source #
fromInteger
function where you need to provide the type 't' of the result
>>>
pl @(FromInteger (SG.Sum _) Id) 23
Present Sum {getSum = 23} PresentT (Sum {getSum = 23})
type FromStringP (t :: Type) p = FromStringP' (Hole t) p Source #
data FromStringP' t s Source #
fromString
function where you need to provide the type 't' of the result
>>>
:set -XOverloadedStrings
>>>
pl @(FromStringP (Identity _) Id) "abc"
Present Identity "abc" PresentT (Identity "abc")
>>>
pl @(FromStringP (Seq.Seq _) Id) "abc"
Present fromList "abc" PresentT (fromList "abc")
class ExtractL6C tp where Source #
type ExtractL6T tp Source #
extractL6C :: tp -> ExtractL6T tp Source #
Instances
ExtractL6C (a, b) Source # | |
Defined in Predicate type ExtractL6T (a, b) :: Type Source # extractL6C :: (a, b) -> ExtractL6T (a, b) Source # | |
ExtractL6C (a, b, c) Source # | |
Defined in Predicate type ExtractL6T (a, b, c) :: Type Source # extractL6C :: (a, b, c) -> ExtractL6T (a, b, c) Source # | |
ExtractL6C (a, b, c, d) Source # | |
Defined in Predicate type ExtractL6T (a, b, c, d) :: Type Source # extractL6C :: (a, b, c, d) -> ExtractL6T (a, b, c, d) Source # | |
ExtractL6C (a, b, c, d, e) Source # | |
Defined in Predicate type ExtractL6T (a, b, c, d, e) :: Type Source # extractL6C :: (a, b, c, d, e) -> ExtractL6T (a, b, c, d, e) Source # | |
ExtractL6C (a, b, c, d, e, f) Source # | |
Defined in Predicate type ExtractL6T (a, b, c, d, e, f) :: Type Source # extractL6C :: (a, b, c, d, e, f) -> ExtractL6T (a, b, c, d, e, f) Source # |
similar to 6th element in a n-tuple
>>>
pl @(L6 Id) (10,"Abc",'x',True,1,99)
Present 99 PresentT 99
class ExtractL5C tp where Source #
type ExtractL5T tp Source #
extractL5C :: tp -> ExtractL5T tp Source #
Instances
ExtractL5C (a, b) Source # | |
Defined in Predicate type ExtractL5T (a, b) :: Type Source # extractL5C :: (a, b) -> ExtractL5T (a, b) Source # | |
ExtractL5C (a, b, c) Source # | |
Defined in Predicate type ExtractL5T (a, b, c) :: Type Source # extractL5C :: (a, b, c) -> ExtractL5T (a, b, c) Source # | |
ExtractL5C (a, b, c, d) Source # | |
Defined in Predicate type ExtractL5T (a, b, c, d) :: Type Source # extractL5C :: (a, b, c, d) -> ExtractL5T (a, b, c, d) Source # | |
ExtractL5C (a, b, c, d, e) Source # | |
Defined in Predicate type ExtractL5T (a, b, c, d, e) :: Type Source # extractL5C :: (a, b, c, d, e) -> ExtractL5T (a, b, c, d, e) Source # | |
ExtractL5C (a, b, c, d, e, f) Source # | |
Defined in Predicate type ExtractL5T (a, b, c, d, e, f) :: Type Source # extractL5C :: (a, b, c, d, e, f) -> ExtractL5T (a, b, c, d, e, f) Source # |
similar to 5th element in a n-tuple
>>>
pl @(L5 Id) (10,"Abc",'x',True,1)
Present 1 PresentT 1
class ExtractL4C tp where Source #
type ExtractL4T tp Source #
extractL4C :: tp -> ExtractL4T tp Source #
Instances
ExtractL4C (a, b) Source # | |
Defined in Predicate type ExtractL4T (a, b) :: Type Source # extractL4C :: (a, b) -> ExtractL4T (a, b) Source # | |
ExtractL4C (a, b, c) Source # | |
Defined in Predicate type ExtractL4T (a, b, c) :: Type Source # extractL4C :: (a, b, c) -> ExtractL4T (a, b, c) Source # | |
ExtractL4C (a, b, c, d) Source # | |
Defined in Predicate type ExtractL4T (a, b, c, d) :: Type Source # extractL4C :: (a, b, c, d) -> ExtractL4T (a, b, c, d) Source # | |
ExtractL4C (a, b, c, d, e) Source # | |
Defined in Predicate type ExtractL4T (a, b, c, d, e) :: Type Source # extractL4C :: (a, b, c, d, e) -> ExtractL4T (a, b, c, d, e) Source # | |
ExtractL4C (a, b, c, d, e, f) Source # | |
Defined in Predicate type ExtractL4T (a, b, c, d, e, f) :: Type Source # extractL4C :: (a, b, c, d, e, f) -> ExtractL4T (a, b, c, d, e, f) Source # |
similar to 4th element in a n-tuple
>>>
pl @(L4 Id) (10,"Abc",'x',True)
Present True PresentT True
>>>
pl @(L4 (Fst (Snd Id))) ('x',((10,"Abc",'x',999),"aa",1),9)
Present 999 PresentT 999
class ExtractL3C tp where Source #
type ExtractL3T tp Source #
extractL3C :: tp -> ExtractL3T tp Source #
Instances
ExtractL3C (a, b) Source # | |
Defined in Predicate type ExtractL3T (a, b) :: Type Source # extractL3C :: (a, b) -> ExtractL3T (a, b) Source # | |
ExtractL3C (a, b, c) Source # | |
Defined in Predicate type ExtractL3T (a, b, c) :: Type Source # extractL3C :: (a, b, c) -> ExtractL3T (a, b, c) Source # | |
ExtractL3C (a, b, c, d) Source # | |
Defined in Predicate type ExtractL3T (a, b, c, d) :: Type Source # extractL3C :: (a, b, c, d) -> ExtractL3T (a, b, c, d) Source # | |
ExtractL3C (a, b, c, d, e) Source # | |
Defined in Predicate type ExtractL3T (a, b, c, d, e) :: Type Source # extractL3C :: (a, b, c, d, e) -> ExtractL3T (a, b, c, d, e) Source # | |
ExtractL3C (a, b, c, d, e, f) Source # | |
Defined in Predicate type ExtractL3T (a, b, c, d, e, f) :: Type Source # extractL3C :: (a, b, c, d, e, f) -> ExtractL3T (a, b, c, d, e, f) Source # |
similar to 3rd element in a n-tuple
>>>
pl @(Thd Id) (10,"Abc",133)
Present 133 PresentT 133
>>>
pl @(Thd Id) (10,"Abc",133,True)
Present 133 PresentT 133
class ExtractL2C tp where Source #
type ExtractL2T tp Source #
extractL2C :: tp -> ExtractL2T tp Source #
Instances
ExtractL2C (a, b) Source # | |
Defined in Predicate type ExtractL2T (a, b) :: Type Source # extractL2C :: (a, b) -> ExtractL2T (a, b) Source # | |
ExtractL2C (a, b, c) Source # | |
Defined in Predicate type ExtractL2T (a, b, c) :: Type Source # extractL2C :: (a, b, c) -> ExtractL2T (a, b, c) Source # | |
ExtractL2C (a, b, c, d) Source # | |
Defined in Predicate type ExtractL2T (a, b, c, d) :: Type Source # extractL2C :: (a, b, c, d) -> ExtractL2T (a, b, c, d) Source # | |
ExtractL2C (a, b, c, d, e) Source # | |
Defined in Predicate type ExtractL2T (a, b, c, d, e) :: Type Source # extractL2C :: (a, b, c, d, e) -> ExtractL2T (a, b, c, d, e) Source # | |
ExtractL2C (a, b, c, d, e, f) Source # | |
Defined in Predicate type ExtractL2T (a, b, c, d, e, f) :: Type Source # extractL2C :: (a, b, c, d, e, f) -> ExtractL2T (a, b, c, d, e, f) Source # |
similar to snd
>>>
pl @(Snd Id) (10,"Abc")
Present "Abc" PresentT "Abc"
>>>
pl @(Snd Id) (10,"Abc",True)
Present "Abc" PresentT "Abc"
class ExtractL1C tp where Source #
type ExtractL1T tp Source #
extractL1C :: tp -> ExtractL1T tp Source #
Instances
ExtractL1C (a, b) Source # | |
Defined in Predicate type ExtractL1T (a, b) :: Type Source # extractL1C :: (a, b) -> ExtractL1T (a, b) Source # | |
ExtractL1C (a, b, c) Source # | |
Defined in Predicate type ExtractL1T (a, b, c) :: Type Source # extractL1C :: (a, b, c) -> ExtractL1T (a, b, c) Source # | |
ExtractL1C (a, b, c, d) Source # | |
Defined in Predicate type ExtractL1T (a, b, c, d) :: Type Source # extractL1C :: (a, b, c, d) -> ExtractL1T (a, b, c, d) Source # | |
ExtractL1C (a, b, c, d, e) Source # | |
Defined in Predicate type ExtractL1T (a, b, c, d, e) :: Type Source # extractL1C :: (a, b, c, d, e) -> ExtractL1T (a, b, c, d, e) Source # | |
ExtractL1C (a, b, c, d, e, f) Source # | |
Defined in Predicate type ExtractL1T (a, b, c, d, e, f) :: Type Source # extractL1C :: (a, b, c, d, e, f) -> ExtractL1T (a, b, c, d, e, f) Source # |
similar to fst
>>>
pl @(Fst Id) (10,"Abc")
Present 10 PresentT 10
>>>
pl @(Fst Id) (10,"Abc",'x')
Present 10 PresentT 10
>>>
pl @(Fst Id) (10,"Abc",'x',False)
Present 10 PresentT 10
similar to length
for Foldable
instances
>>>
pl @(Length Id) (Left "aa")
Present 0 PresentT 0
>>>
pl @(Length Id) (Right "aa")
Present 1 PresentT 1
>>>
pl @(Length (Right' Id)) (Right "abcd")
Present 4 PresentT 4
>>>
pl @(Length (Thd (Snd Id))) (True,(23,'x',[10,9,1,3,4,2]))
Present 6 PresentT 6
similar to length
>>>
pl @Len [10,4,5,12,3,4]
Present 6 PresentT 6
>>>
pl @Len []
Present 0 PresentT 0
sort a list
>>>
pl @(SortOn (Fst Id) Id) [(10,"abc"), (3,"def"), (4,"gg"), (10,"xyz"), (1,"z")]
Present [(1,"z"),(3,"def"),(4,"gg"),(10,"abc"),(10,"xyz")] PresentT [(1,"z"),(3,"def"),(4,"gg"),(10,"abc"),(10,"xyz")]
similar to maximum
>>>
pl @Max [10,4,5,12,3,4]
Present 12 PresentT 12
>>>
pl @Max []
Error empty list FailT "empty list"
similar to minimum
>>>
pl @Min [10,4,5,12,3,4]
Present 3 PresentT 3
>>>
pl @Min []
Error empty list FailT "empty list"
uses the Read
of the given type 't' and 'p' which points to the content to read
>>>
pl @(ReadP Rational) "4 % 5"
Present 4 % 5 PresentT (4 % 5)
>>>
pl @(ReadP' Day Id >> Between (ReadP' Day "2017-04-11") (ReadP' Day "2018-12-30")) "2018-10-12"
True TrueT
>>>
pl @(ReadP' Day Id >> Between (ReadP' Day "2017-04-11") (ReadP' Day "2018-12-30")) "2016-10-12"
False FalseT
uncreate a Day
returning year month and day
>>>
pl @(UnMkDay Id) (read "2019-12-30")
Present (2019,12,30) PresentT (2019,12,30)
create a Day
from three int values passed in as year month and day
>>>
pl @MkDay (2019,12,30)
Present Just (2019-12-30,1,1) PresentT (Just (2019-12-30,1,1))
>>>
pl @(MkDay' (Fst Id) (Snd Id) (Thd Id)) (2019,99,99999)
Present Nothing PresentT Nothing
>>>
pl @MkDay (1999,3,13)
Present Just (1999-03-13,10,6) PresentT (Just (1999-03-13,10,6))
type ParseTimes (t :: Type) p q = ParseTimes' (Hole t) p q Source #
data ParseTimes' t p q Source #
A convenience method to match against many different datetime formats to find a match
>>>
pl @(ParseTimes LocalTime '["%Y-%m-%d %H:%M:%S", "%m/%d/%y %H:%M:%S", "%B %d %Y %H:%M:%S", "%Y-%m-%dT%H:%M:%S"] "03/11/19 01:22:33") ()
Present 2019-03-11 01:22:33 PresentT 2019-03-11 01:22:33
>>>
pl @(ParseTimes LocalTime (Fst Id) (Snd Id)) (["%Y-%m-%d %H:%M:%S", "%m/%d/%y %H:%M:%S", "%B %d %Y %H:%M:%S", "%Y-%m-%dT%H:%M:%S"], "03/11/19 01:22:33")
Present 2019-03-11 01:22:33 PresentT 2019-03-11 01:22:33
type ParseTimeP (t :: Type) p q = ParseTimeP' (Hole t) p q Source #
data ParseTimeP' t p q Source #
similar to parseTimeM
where 't' is the ParseTime
type, 'p' is the datetime format and 'q' points to the content to parse
>>>
pl @(ParseTimeP LocalTime "%F %T" Id) "2019-05-24 05:19:59"
Present 2019-05-24 05:19:59 PresentT 2019-05-24 05:19:59
>>>
pl @(ParseTimeP LocalTime "%F %T" "2019-05-24 05:19:59") (Right "we ignore this using Symbol and not Id")
Present 2019-05-24 05:19:59 PresentT 2019-05-24 05:19:59
keeping 'q' as we might want to extract from a tuple
data FormatTimeP p q Source #
type level expression representing a formatted time
similar to formatTime
using a type level Symbol
to get the formatting string
>>>
pl @(FormatTimeP "%F %T" Id) (read "2019-05-24 05:19:59" :: LocalTime)
Present "2019-05-24 05:19:59" PresentT "2019-05-24 05:19:59"
>>>
pl @(FormatTimeP (Fst Id) (Snd Id)) ("the date is %d/%m/%Y", read "2019-05-24" :: Day)
Present "the date is 24/05/2019" PresentT "the date is 24/05/2019"
similar to show
>>>
pl @(ShowP Id) [4,8,3,9]
Present "[4,8,3,9]" PresentT "[4,8,3,9]"
>>>
pl @(ShowP Id) 'x'
Present "'x'" PresentT "'x'"
>>>
pl @(ShowP (42 %- 10)) 'x'
Present "(-21) % 5" PresentT "(-21) % 5"
split a list into single values
>>>
pl @(Ones Id) [4,8,3,9]
Present [[4],[8],[3],[9]] PresentT [[4],[8],[3],[9]]
>>>
pl @(Ones Id) []
Present [] PresentT []
similar to tails
>>>
pl @Tails [4,8,3,9]
Present [[4,8,3,9],[8,3,9],[3,9],[9],[]] PresentT [[4,8,3,9],[8,3,9],[3,9],[9],[]]
>>>
pl @Tails []
Present [[]] PresentT [[]]
similar to inits
>>>
pl @Inits [4,8,3,9]
Present [[],[4],[4,8],[4,8,3],[4,8,3,9]] PresentT [[],[4],[4,8],[4,8,3],[4,8,3,9]]
>>>
pl @Inits []
Present [[]] PresentT [[]]
converts a string IsText
value to upper case
>>>
pl @ToUpper "HeLlO wOrld!"
Present "HELLO WORLD!" PresentT "HELLO WORLD!"
converts a string IsText
value to lower case
>>>
pl @ToLower "HeLlO wOrld!"
Present "hello world!" PresentT "hello world!"
type IsSeparator = IsCharSet CSeparator Source #
type IsOctDigit = IsCharSet COctDigit Source #
type IsHexDigit = IsCharSet CHexDigit Source #
type IsPunctuation = IsCharSet CPunctuation Source #
type IsNumber = IsCharSet CNumber Source #
predicate for determining if the string is all digits >>> pl @IsNumber "213G" False FalseT
>>>
pl @IsNumber "929"
True TrueT
type IsLower = IsCharSet CLower Source #
predicate for determining if a string is all lowercase >>> pl @IsLower "abcdef213" False FalseT
>>>
pl @IsLower "abcdef"
True TrueT
>>>
pl @IsLower ""
True TrueT
>>>
pl @IsLower "abcdefG"
False FalseT
class GetCharSet (cs :: CharSet) where Source #
data IsCharSet (cs :: CharSet) Source #
a predicate for determining if a string IsText
belongs to the given character set
>>>
import qualified Data.Text as T
>>>
pl @IsLower "abc"
True TrueT
>>>
pl @IsLower "abcX"
False FalseT
>>>
pl @IsLower (T.pack "abcX")
False FalseT
>>>
pl @IsHexDigit "01efA"
True TrueT
>>>
pl @IsHexDigit "01egfA"
False FalseT
A replacement function ([String] -> String) which yields the groups
Used by sub
and sub
Requires Text.Show.Functions
>>>
:m + Text.Show.Functions
>>>
pl @(ReplaceAll "^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$" (MakeRR3 (Fst Id)) (Snd Id)) (\ys -> intercalate " | " $ map (show . succ . read @Int) ys, "141.201.1.22")
Present "142 | 202 | 2 | 23" PresentT "142 | 202 | 2 | 23"
A replacement function (String -> String) that yields the whole match
Used by sub
and sub
Requires Text.Show.Functions
>>>
:m + Text.Show.Functions
>>>
pl @(ReplaceAll "\\." (MakeRR2 (Fst Id)) (Snd Id)) (\x -> x <> ":" <> x, "141.201.1.22")
Present "141.:.201.:.1.:.22" PresentT "141.:.201.:.1.:.22"
A replacement function (String -> [String] -> String) which returns the whole match and the groups
Used by sub
and sub
Requires Text.Show.Functions
Simple replacement string: see ReplaceAllString
and ReplaceOneString
type ReplaceOneString p q r = ReplaceOneString' '[] p q r Source #
type ReplaceOneString' (rs :: [ROpt]) p q r = ReplaceOne' rs p (MakeRR q) r Source #
type ReplaceAllString p q r = ReplaceAllString' '[] p q r Source #
type ReplaceAllString' (rs :: [ROpt]) p q r = ReplaceAll' rs p (MakeRR q) r Source #
type ReplaceOne p q r = ReplaceOne' '[] p q r Source #
type ReplaceOne' (rs :: [ROpt]) p q r = ReplaceImpl False rs p q r Source #
type ReplaceAll p q r = ReplaceAll' '[] p q r Source #
type ReplaceAll' (rs :: [ROpt]) p q r = ReplaceImpl True rs p q r Source #
data ReplaceImpl (alle :: Bool) (rs :: [ROpt]) p q r Source #
replaces regex 's' with a string 's1' inside the value
>>>
pl @(ReplaceAllString "\\." ":" Id) "141.201.1.22"
Present "141:201:1:22" PresentT "141:201:1:22"
data Resplit' (rs :: [ROpt]) p q Source #
splits a string on a regex delimiter
>>>
pl @(Resplit "\\." Id) "141.201.1.22"
Present ["141","201","1","22"] PresentT ["141","201","1","22"]
>>>
pl @(Resplit (Singleton (Fst Id)) (Snd Id)) (':', "12:13:1")
Present ["12","13","1"] PresentT ["12","13","1"]
type RescanRanges p q = RescanRanges' '[] p q Source #
data RescanRanges' (rs :: [ROpt]) p q Source #
similar to Rescan
but gives the column start and ending positions instead of values
>>>
pl @(RescanRanges "^(\\d{2}):(\\d{2}):(\\d{2})$" Id) "13:05:25"
Present [((0,8),[(0,2),(3,5),(6,8)])] PresentT [((0,8),[(0,2),(3,5),(6,8)])]
data Rescan' (rs :: [ROpt]) p q Source #
runs a regex matcher returning the original values and optionally any groups
>>>
pl @(Rescan "^(\\d{2}):(\\d{2}):(\\d{2})$" Id) "13:05:25"
Present [("13:05:25",["13","05","25"])] PresentT [("13:05:25",["13","05","25"])]
>>>
pl @(Rescan (Snd Id) "13:05:25") ('a',"^(\\d{2}):(\\d{2}):(\\d{2})$")
Present [("13:05:25",["13","05","25"])] PresentT [("13:05:25",["13","05","25"])]
data Re' (rs :: [ROpt]) p q Source #
represents a predicate using a Symbol
as a regular expression
evaluates Re
and returns True if there is a match
>>>
pl @(Re "^\\d{2}:\\d{2}:\\d{2}$" Id) "13:05:25"
True TrueT
type Unzip = '(Map (Fst Id) Id, Map (Snd Id) Id) Source #
unzip
equivalent
>>>
pl @Unzip (zip [1..5] "abcd")
Present ([1,2,3,4],"abcd") PresentT ([1,2,3,4],"abcd")
type Any x p = Ors (Map x p) Source #
similar to any
>>>
pl @(Any Even Id) [1,5,11,5,3]
False FalseT
>>>
pl @(Any Even Id) [1,5,112,5,3]
True TrueT
>>>
pl @(Any Even Id) []
False FalseT
type All x p = Ands (Map x p) Source #
similar to all
>>>
pl @(All Even Id) [1,5,11,5,3]
False FalseT
>>>
pl @(All Odd Id) [1,5,11,5,3]
True TrueT
>>>
pl @(All Odd Id) []
True TrueT
type AllNegative = Ands (Map Negative Id) Source #
a type level predicate for all negative elements in a list
type AllPositive = Ands (Map Positive Id) Source #
a type level predicate for all positive elements in a list
>>>
pl @AllPositive [1,5,10,2,3]
True TrueT
>>>
pl @AllPositive [0,1,5,10,2,3]
False FalseT
>>>
pl @AllPositive [3,1,-5,10,2,3]
False FalseT
>>>
pl @AllNegative [-1,-5,-10,-2,-3]
True TrueT
type Between p q = Ge p && Le q Source #
A predicate that determines if the value is between 'p' and 'q'
>>>
pl @(Between' 5 8 Len) [1,2,3,4,5,5,7]
True TrueT
>>>
pl @(Between 5 8) 6
True TrueT
>>>
pl @(Between 5 8) 9
False FalseT
type Desc' = Ands (Map (Fst Id > Snd Id) Pairs) Source #
a type level predicate for a strictly decreasing list
type Desc = Ands (Map (Fst Id >= Snd Id) Pairs) Source #
a type level predicate for a monotonic decreasing list
type Asc' = Ands (Map (Fst Id < Snd Id) Pairs) Source #
a type level predicate for a strictly increasing list
type Asc = Ands (Map (Fst Id <= Snd Id) Pairs) Source #
a type level predicate for a monotonic increasing list
>>>
pl @Asc "aaacdef"
True TrueT
>>>
pl @Asc [1,2,3,4,5,5,7]
True TrueT
>>>
pl @Asc' [1,2,3,4,5,5,7]
False FalseT
>>>
pl @Asc "axacdef"
False FalseT
simpleAlign :: [a] -> [b] -> [These a b] Source #
getValidBase :: Int -> String Source #