packages feed

predicate-typed 0.5.1.0 → 0.6.0.0

raw patch · 10 files changed

+678/−262 lines, 10 filesdep +hashablePVP ok

version bump matches the API change (PVP)

Dependencies added: hashable

API changes (from Hackage documentation)

- Predicate.Prelude: data FromStringP (t :: Type) p
- Predicate.Prelude: data FromStringP' t s
- Predicate.Prelude: data Sapa
- Predicate.Prelude: data Sapa' (t :: Type)
- Predicate.Prelude: instance (GHC.TypeNats.KnownNat n, GHC.Show.Show a) => Predicate.Core.P (Predicate.Prelude.BoolsImpl n '[]) [a]
- Predicate.Prelude: instance (Predicate.Prelude.GetCharSet cs, GHC.Show.Show a, Data.Text.Lens.IsText a) => Predicate.Core.P (Predicate.Prelude.IsCharSet cs) a
- Predicate.Prelude: instance (TypeError ...) => Predicate.Core.P (Predicate.Prelude.ParaImpl n '[]) [a]
- Predicate.Prelude: instance (a Data.Type.Equality.~ GHC.Exts.Item t, GHC.Show.Show t, GHC.Exts.IsList t) => Predicate.Core.P (Predicate.Prelude.FromList t) [a]
- Predicate.Prelude: instance GHC.Show.Show a => Predicate.Core.P (Predicate.Prelude.GuardsImpl n '[]) [a]
- Predicate.Prelude: instance GHC.Show.Show a => Predicate.Core.P (Predicate.Prelude.GuardsImplX n '[]) [a]
- Predicate.Prelude: instance GHC.Show.Show a => Predicate.Core.P Predicate.Prelude.Inits [a]
- Predicate.Prelude: instance GHC.Show.Show a => Predicate.Core.P Predicate.Prelude.Tails [a]
- Predicate.Prelude: instance Predicate.Core.P (Predicate.Prelude.SapaT' t) x => Predicate.Core.P (Predicate.Prelude.Sapa' t) x
- Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.SapaT x => Predicate.Core.P Predicate.Prelude.Sapa x
- Predicate.Prelude: instance forall k (n :: GHC.Types.Nat) (p :: k) a. (Predicate.Core.P (Predicate.Prelude.ParaImpl (Predicate.Util.LenT (Predicate.Util.RepeatT n p)) (Predicate.Util.RepeatT n p)) [a], Predicate.Util.GetLen (Predicate.Util.RepeatT n p)) => Predicate.Core.P (Predicate.Prelude.ParaN n p) [a]
- Predicate.Prelude: instance forall k (ps :: [k]) a. (Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.ParaImpl (Predicate.Util.LenT ps) ps) [a]) => Predicate.Core.P (Predicate.Prelude.Para ps) [a]
- Predicate.Prelude: instance forall k k1 (ps :: [(k, k1)]) a. (Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.BoolsImpl (Predicate.Util.LenT ps) ps) [a], Predicate.Core.PP (Predicate.Prelude.BoolsImpl (Predicate.Util.LenT ps) ps) [a] Data.Type.Equality.~ GHC.Types.Bool) => Predicate.Core.P (Predicate.Prelude.Bools ps) [a]
- Predicate.Prelude: instance forall k k1 (ps :: [(k, k1)]) a. (Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.GuardsImpl (Predicate.Util.LenT ps) ps) [a]) => Predicate.Core.P (Predicate.Prelude.Guards ps) [a]
- Predicate.Prelude: instance forall k k1 (ps :: [(k, k1)]) a. (Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.GuardsImplX (Predicate.Util.LenT ps) ps) [a]) => Predicate.Core.P (Predicate.Prelude.GuardsDetailImpl ps) [a]
- Predicate.Prelude: instance forall k t (p :: k) x. Predicate.Core.P (Predicate.Prelude.FromStringPT t p) x => Predicate.Core.P (Predicate.Prelude.FromStringP t p) x
- Predicate.Prelude: instance forall k1 k (prt :: k) (n :: GHC.Types.Nat) (p :: k1) a. Predicate.Core.P (Predicate.Prelude.BoolsNT prt n p) [a] => Predicate.Core.P (Predicate.Prelude.BoolsN prt n p) [a]
- Predicate.Prelude: instance forall k1 k (prt :: k) a (n :: GHC.Types.Nat) (ps :: [(k, k1)]) (p :: k1). (Predicate.Core.PP prt (GHC.Types.Int, a) Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P prt (GHC.Types.Int, a), GHC.TypeNats.KnownNat n, Predicate.Util.GetLen ps, Predicate.Core.P p a, Predicate.Core.PP p a Data.Type.Equality.~ GHC.Types.Bool, Predicate.Core.P (Predicate.Prelude.BoolsImpl n ps) [a], Predicate.Core.PP (Predicate.Prelude.BoolsImpl n ps) [a] Data.Type.Equality.~ GHC.Types.Bool) => Predicate.Core.P (Predicate.Prelude.BoolsImpl n ('(prt, p) : ps)) [a]
- Predicate.Prelude: instance forall k1 k (prt :: k) a (n :: GHC.Types.Nat) (ps :: [(k, k1)]) (p :: k1). (Predicate.Core.PP prt (GHC.Types.Int, a) Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P prt (GHC.Types.Int, a), GHC.TypeNats.KnownNat n, Predicate.Util.GetLen ps, Predicate.Core.P p a, Predicate.Core.PP p a Data.Type.Equality.~ GHC.Types.Bool, Predicate.Core.P (Predicate.Prelude.GuardsImpl n ps) [a], Predicate.Core.PP (Predicate.Prelude.GuardsImpl n ps) [a] Data.Type.Equality.~ [a], GHC.Show.Show a) => Predicate.Core.P (Predicate.Prelude.GuardsImpl n ('(prt, p) : ps)) [a]
- Predicate.Prelude: instance forall k1 k (prt :: k) a (n :: GHC.Types.Nat) (ps :: [(k, k1)]) (p :: k1). (Predicate.Core.PP prt a Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P prt a, GHC.TypeNats.KnownNat n, Predicate.Util.GetLen ps, Predicate.Core.P p a, Predicate.Core.PP p a Data.Type.Equality.~ GHC.Types.Bool, Predicate.Core.P (Predicate.Prelude.GuardsImplX n ps) [a], Predicate.Core.PP (Predicate.Prelude.GuardsImplX n ps) [a] Data.Type.Equality.~ [a], GHC.Show.Show a) => Predicate.Core.P (Predicate.Prelude.GuardsImplX n ('(prt, p) : ps)) [a]
- Predicate.Prelude: instance forall k1 k2 (p :: k2) x (t :: k1). (Predicate.Core.P p x, Predicate.Core.PP p x Data.Type.Equality.~ GHC.Base.String, Data.Typeable.Internal.Typeable (Predicate.Core.PP t x), GHC.Show.Show (Predicate.Core.PP t x), Data.Aeson.Types.FromJSON.FromJSON (Predicate.Core.PP t x)) => Predicate.Core.P (Predicate.Prelude.ParseJson' t p) x
- Predicate.Prelude: instance forall k1 k2 (prt :: k2) (n :: GHC.Types.Nat) (p :: k1) a. Predicate.Core.P (Predicate.Prelude.GuardsNT prt n p) [a] => Predicate.Core.P (Predicate.Prelude.GuardsN prt n p) [a]
- Predicate.Prelude: instance forall k1 k2 (s :: k2) a (t :: k1). (Predicate.Core.P s a, Predicate.Core.PP s a Data.Type.Equality.~ GHC.Base.String, GHC.Show.Show (Predicate.Core.PP t a), Data.String.IsString (Predicate.Core.PP t a)) => Predicate.Core.P (Predicate.Prelude.FromStringP' t s) a
- Predicate.Refined2: XF :: String -> Results2 a
- Predicate.Refined2: XTF :: a -> String -> Results2 a
- Predicate.Refined2: XTFalse :: a -> String -> Results2 a
- Predicate.Refined2: XTTrue :: a -> Results2 a
- Predicate.Refined2: data Results2 a
- Predicate.Refined2: instance GHC.Classes.Eq a => GHC.Classes.Eq (Predicate.Refined2.Results2 a)
- Predicate.Refined2: instance GHC.Show.Show a => GHC.Show.Show (Predicate.Refined2.Results2 a)
- Predicate.Refined3: XF :: String -> Results3 a b
- Predicate.Refined3: XTF :: a -> String -> Results3 a b
- Predicate.Refined3: XTFalse :: a -> String -> Results3 a b
- Predicate.Refined3: XTTrueF :: a -> String -> Results3 a b
- Predicate.Refined3: XTTrueT :: a -> b -> Results3 a b
- Predicate.Refined3: data Results3 a b
- Predicate.Refined3: instance (GHC.Classes.Eq a, GHC.Classes.Eq b) => GHC.Classes.Eq (Predicate.Refined3.Results3 a b)
- Predicate.Refined3: instance (GHC.Show.Show a, GHC.Show.Show b) => GHC.Show.Show (Predicate.Refined3.Results3 a b)
- Predicate.Util: infixr 6 <%>
+ Predicate.Prelude: data BetweenA p q
+ Predicate.Prelude: data ChunksOf n p
+ Predicate.Prelude: data EncodeJsonFile p q
+ Predicate.Prelude: data FromString (t :: Type) p
+ Predicate.Prelude: data FromString' t s
+ Predicate.Prelude: data IsControlAll
+ Predicate.Prelude: data IsHexDigitAll
+ Predicate.Prelude: data IsLatin1All
+ Predicate.Prelude: data IsLowerAll
+ Predicate.Prelude: data IsNumberAll
+ Predicate.Prelude: data IsOctDigitAll
+ Predicate.Prelude: data IsPunctuationAll
+ Predicate.Prelude: data IsSeparatorAll
+ Predicate.Prelude: data IsSpaceAll
+ Predicate.Prelude: data IsUpperAll
+ Predicate.Prelude: data Product
+ Predicate.Prelude: data Rotate n p
+ Predicate.Prelude: data SapA
+ Predicate.Prelude: data SapA' (t :: Type)
+ Predicate.Prelude: data ToString p
+ Predicate.Prelude: instance (GHC.Num.Num a, GHC.Show.Show a) => Predicate.Core.P Predicate.Prelude.Product [a]
+ Predicate.Prelude: instance (GHC.TypeNats.KnownNat n, GHC.Show.Show a, [a] Data.Type.Equality.~ x) => Predicate.Core.P (Predicate.Prelude.BoolsImpl n '[]) x
+ Predicate.Prelude: instance (Predicate.Prelude.GetCharSet cs, GHC.Show.Show a, Data.Text.Lens.IsText a) => Predicate.Core.P (Predicate.Prelude.IsCharSetAll cs) a
+ Predicate.Prelude: instance (TypeError ...) => Predicate.Core.P (Predicate.Prelude.ParaImpl n '[]) x
+ Predicate.Prelude: instance ([a] Data.Type.Equality.~ x, GHC.Show.Show a) => Predicate.Core.P (Predicate.Prelude.GuardsImpl n '[]) x
+ Predicate.Prelude: instance ([a] Data.Type.Equality.~ x, GHC.Show.Show a) => Predicate.Core.P (Predicate.Prelude.GuardsImplX n '[]) x
+ Predicate.Prelude: instance ([a] Data.Type.Equality.~ x, GHC.Show.Show a) => Predicate.Core.P Predicate.Prelude.Inits x
+ Predicate.Prelude: instance ([a] Data.Type.Equality.~ x, GHC.Show.Show a) => Predicate.Core.P Predicate.Prelude.Tails x
+ Predicate.Prelude: instance (a Data.Type.Equality.~ GHC.Exts.Item t, GHC.Show.Show t, GHC.Exts.IsList t, [a] Data.Type.Equality.~ x) => Predicate.Core.P (Predicate.Prelude.FromList t) x
+ Predicate.Prelude: instance (x Data.Type.Equality.~ GHC.Types.Char, Predicate.Prelude.GetCharSet cs) => Predicate.Core.P (Predicate.Prelude.IsCharSet cs) x
+ Predicate.Prelude: instance Predicate.Core.P (Predicate.Prelude.SapAT' t) x => Predicate.Core.P (Predicate.Prelude.SapA' t) x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsControlAllT x => Predicate.Core.P Predicate.Prelude.IsControlAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsHexDigitAllT x => Predicate.Core.P Predicate.Prelude.IsHexDigitAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsLatin1AllT x => Predicate.Core.P Predicate.Prelude.IsLatin1All x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsLowerAllT x => Predicate.Core.P Predicate.Prelude.IsLowerAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsNumberAllT x => Predicate.Core.P Predicate.Prelude.IsNumberAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsOctDigitAllT x => Predicate.Core.P Predicate.Prelude.IsOctDigitAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsPunctuationAllT x => Predicate.Core.P Predicate.Prelude.IsPunctuationAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsSeparatorAllT x => Predicate.Core.P Predicate.Prelude.IsSeparatorAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsSpaceAllT x => Predicate.Core.P Predicate.Prelude.IsSpaceAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.IsUpperAllT x => Predicate.Core.P Predicate.Prelude.IsUpperAll x
+ Predicate.Prelude: instance Predicate.Core.P Predicate.Prelude.SapAT x => Predicate.Core.P Predicate.Prelude.SapA x
+ Predicate.Prelude: instance Predicate.Prelude.GetCharSet 'Predicate.Prelude.CSpace
+ Predicate.Prelude: instance Predicate.Prelude.ToStringC Data.ByteString.Internal.ByteString
+ Predicate.Prelude: instance Predicate.Prelude.ToStringC Data.ByteString.Lazy.Internal.ByteString
+ Predicate.Prelude: instance Predicate.Prelude.ToStringC Data.Text.Internal.Lazy.Text
+ Predicate.Prelude: instance Predicate.Prelude.ToStringC Data.Text.Internal.Text
+ Predicate.Prelude: instance Predicate.Prelude.ToStringC GHC.Base.String
+ Predicate.Prelude: instance forall k (n :: GHC.Types.Nat) (p :: k) x a. (Predicate.Core.P (Predicate.Prelude.ParaImpl (Predicate.Util.LenT (Predicate.Util.RepeatT n p)) (Predicate.Util.RepeatT n p)) x, Predicate.Util.GetLen (Predicate.Util.RepeatT n p), x Data.Type.Equality.~ [a]) => Predicate.Core.P (Predicate.Prelude.ParaN n p) x
+ Predicate.Prelude: instance forall k (p :: k) x. (Predicate.Prelude.ToStringC (Predicate.Core.PP p x), Predicate.Core.P p x) => Predicate.Core.P (Predicate.Prelude.ToString p) x
+ Predicate.Prelude: instance forall k a x (ps :: [k]). ([a] Data.Type.Equality.~ x, Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.ParaImpl (Predicate.Util.LenT ps) ps) x) => Predicate.Core.P (Predicate.Prelude.Para ps) x
+ Predicate.Prelude: instance forall k k1 a x (ps :: [(k, k1)]). ([a] Data.Type.Equality.~ x, Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.BoolsImpl (Predicate.Util.LenT ps) ps) x, Predicate.Core.PP (Predicate.Prelude.BoolsImpl (Predicate.Util.LenT ps) ps) x Data.Type.Equality.~ GHC.Types.Bool) => Predicate.Core.P (Predicate.Prelude.Bools ps) x
+ Predicate.Prelude: instance forall k k1 a x (ps :: [(k, k1)]). ([a] Data.Type.Equality.~ x, Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.GuardsImpl (Predicate.Util.LenT ps) ps) x) => Predicate.Core.P (Predicate.Prelude.Guards ps) x
+ Predicate.Prelude: instance forall k k1 a x (ps :: [(k, k1)]). ([a] Data.Type.Equality.~ x, Predicate.Util.GetLen ps, Predicate.Core.P (Predicate.Prelude.GuardsImplX (Predicate.Util.LenT ps) ps) x) => Predicate.Core.P (Predicate.Prelude.GuardsDetailImpl ps) x
+ Predicate.Prelude: instance forall k t (p :: k) x. Predicate.Core.P (Predicate.Prelude.FromStringPT t p) x => Predicate.Core.P (Predicate.Prelude.FromString t p) x
+ Predicate.Prelude: instance forall k1 k (prt :: k) a (n :: GHC.Types.Nat) (ps :: [(k, k1)]) (p :: k1) x. (Predicate.Core.PP prt (GHC.Types.Int, a) Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P prt (GHC.Types.Int, a), GHC.TypeNats.KnownNat n, Predicate.Util.GetLen ps, Predicate.Core.P p a, Predicate.Core.PP p a Data.Type.Equality.~ GHC.Types.Bool, Predicate.Core.P (Predicate.Prelude.BoolsImpl n ps) x, Predicate.Core.PP (Predicate.Prelude.BoolsImpl n ps) [a] Data.Type.Equality.~ GHC.Types.Bool, [a] Data.Type.Equality.~ x) => Predicate.Core.P (Predicate.Prelude.BoolsImpl n ('(prt, p) : ps)) x
+ Predicate.Prelude: instance forall k1 k (prt :: k) a (n :: GHC.Types.Nat) (ps :: [(k, k1)]) (p :: k1) x. (Predicate.Core.PP prt (GHC.Types.Int, a) Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P prt (GHC.Types.Int, a), GHC.TypeNats.KnownNat n, Predicate.Util.GetLen ps, Predicate.Core.P p a, Predicate.Core.PP p a Data.Type.Equality.~ GHC.Types.Bool, Predicate.Core.P (Predicate.Prelude.GuardsImpl n ps) [a], Predicate.Core.PP (Predicate.Prelude.GuardsImpl n ps) [a] Data.Type.Equality.~ [a], GHC.Show.Show a, [a] Data.Type.Equality.~ x) => Predicate.Core.P (Predicate.Prelude.GuardsImpl n ('(prt, p) : ps)) x
+ Predicate.Prelude: instance forall k1 k (prt :: k) a (n :: GHC.Types.Nat) (ps :: [(k, k1)]) (p :: k1) x. (Predicate.Core.PP prt a Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P prt a, GHC.TypeNats.KnownNat n, Predicate.Util.GetLen ps, Predicate.Core.P p a, Predicate.Core.PP p a Data.Type.Equality.~ GHC.Types.Bool, Predicate.Core.P (Predicate.Prelude.GuardsImplX n ps) [a], Predicate.Core.PP (Predicate.Prelude.GuardsImplX n ps) [a] Data.Type.Equality.~ [a], GHC.Show.Show a, [a] Data.Type.Equality.~ x) => Predicate.Core.P (Predicate.Prelude.GuardsImplX n ('(prt, p) : ps)) x
+ Predicate.Prelude: instance forall k1 k x a (prt :: k) (n :: GHC.Types.Nat) (p :: k1). (x Data.Type.Equality.~ [a], Predicate.Core.P (Predicate.Prelude.BoolsNT prt n p) x) => Predicate.Core.P (Predicate.Prelude.BoolsN prt n p) x
+ Predicate.Prelude: instance forall k1 k2 (n :: k2) (p :: k1) x. Predicate.Core.P (Predicate.Prelude.RotateT n p) x => Predicate.Core.P (Predicate.Prelude.Rotate n p) x
+ Predicate.Prelude: instance forall k1 k2 (p :: k2) a b (n :: k1). (Predicate.Core.PP p a Data.Type.Equality.~ [b], Predicate.Core.P n a, Predicate.Core.P p a, GHC.Show.Show b, GHC.Real.Integral (Predicate.Core.PP n a)) => Predicate.Core.P (Predicate.Prelude.ChunksOf n p) a
+ Predicate.Prelude: instance forall k1 k2 (p :: k2) x (q :: k1). (Predicate.Core.PP p x Data.Type.Equality.~ GHC.Base.String, Predicate.Core.P p x, Data.Aeson.Types.ToJSON.ToJSON (Predicate.Core.PP q x), Predicate.Core.P q x) => Predicate.Core.P (Predicate.Prelude.EncodeJsonFile p q) x
+ Predicate.Prelude: instance forall k1 k2 (p :: k2) x (t :: k1). (Predicate.Core.P p x, Predicate.Core.PP p x Data.Type.Equality.~ Data.ByteString.Lazy.Internal.ByteString, Data.Typeable.Internal.Typeable (Predicate.Core.PP t x), GHC.Show.Show (Predicate.Core.PP t x), Data.Aeson.Types.FromJSON.FromJSON (Predicate.Core.PP t x)) => Predicate.Core.P (Predicate.Prelude.ParseJson' t p) x
+ Predicate.Prelude: instance forall k1 k2 (p :: k2) x a a' (q :: k1). (Predicate.Core.PP p x Data.Type.Equality.~ (a, a'), Predicate.Core.P q x, Predicate.Core.PP q x Data.Type.Equality.~ a, GHC.Classes.Ord a, a Data.Type.Equality.~ a', GHC.Show.Show a, Predicate.Core.P p x) => Predicate.Core.P (Predicate.Prelude.BetweenA p q) x
+ Predicate.Prelude: instance forall k1 k2 (s :: k2) a (t :: k1). (Predicate.Core.P s a, Predicate.Core.PP s a Data.Type.Equality.~ GHC.Base.String, GHC.Show.Show (Predicate.Core.PP t a), Data.String.IsString (Predicate.Core.PP t a)) => Predicate.Core.P (Predicate.Prelude.FromString' t s) a
+ Predicate.Prelude: instance forall k1 k2 x a (prt :: k2) (n :: GHC.Types.Nat) (p :: k1). (x Data.Type.Equality.~ [a], Predicate.Core.P (Predicate.Prelude.GuardsNT prt n p) x) => Predicate.Core.P (Predicate.Prelude.GuardsN prt n p) x
+ Predicate.Refined: instance forall k (p :: k) a. (Predicate.Refined.RefinedC p a, Data.Hashable.Class.Hashable a) => Data.Hashable.Class.Hashable (Predicate.Refined.Refined p a)
+ Predicate.Refined2: instance forall k1 k2 (ip :: k2) (op :: k1) i. (Predicate.Refined2.Refined2C ip op i, Data.Hashable.Class.Hashable i) => Data.Hashable.Class.Hashable (Predicate.Refined2.Refined2 ip op i)
+ Predicate.Refined3: instance forall k1 k2 k3 (ip :: k3) (op :: k2) (fmt :: k1) i. (Predicate.Refined3.Refined3C ip op fmt i, Data.Hashable.Class.Hashable (Predicate.Core.PP ip i)) => Data.Hashable.Class.Hashable (Predicate.Refined3.Refined3 ip op fmt i)
+ Predicate.Util: infixr 7 <%>
+ Predicate.Util: litBL :: Int -> ByteString -> String
+ Predicate.Util: litBS :: Int -> ByteString -> String
- Predicate.Refined2: Msg2 :: String -> String -> String -> Msg2
+ Predicate.Refined2: Msg2 :: !String -> !String -> !String -> Msg2
- Predicate.Refined2: [m2Desc] :: Msg2 -> String
+ Predicate.Refined2: [m2Desc] :: Msg2 -> !String
- Predicate.Refined2: [m2Long] :: Msg2 -> String
+ Predicate.Refined2: [m2Long] :: Msg2 -> !String
- Predicate.Refined2: [m2Short] :: Msg2 -> String
+ Predicate.Refined2: [m2Short] :: Msg2 -> !String
- Predicate.Refined2: withRefined2TP :: forall m ip op i b proxy. (Monad m, Refined2C ip op i, Show (PP ip i), Show i) => proxy '(ip, op, i) -> POpts -> i -> (Refined2 ip op i -> RefinedT m b) -> RefinedT m b
+ Predicate.Refined2: withRefined2TP :: forall m ip op i b proxy. (Monad m, Refined2C ip op i, Show (PP ip i)) => proxy '(ip, op, i) -> POpts -> i -> (Refined2 ip op i -> RefinedT m b) -> RefinedT m b
- Predicate.Refined3: Msg3 :: String -> String -> String -> Msg3
+ Predicate.Refined3: Msg3 :: !String -> !String -> !String -> Msg3
- Predicate.Refined3: [m3Desc] :: Msg3 -> String
+ Predicate.Refined3: [m3Desc] :: Msg3 -> !String
- Predicate.Refined3: [m3Long] :: Msg3 -> String
+ Predicate.Refined3: [m3Long] :: Msg3 -> !String
- Predicate.Refined3: [m3Short] :: Msg3 -> String
+ Predicate.Refined3: [m3Short] :: Msg3 -> !String
- Predicate.Util: POpts :: Int -> !ODebug -> Disp -> !(String, PColor) -> POpts
+ Predicate.Util: POpts :: !Int -> !ODebug -> !Disp -> !(String, PColor) -> POpts
- Predicate.Util: RReplace :: String -> RReplace
+ Predicate.Util: RReplace :: !String -> RReplace
- Predicate.Util: TT :: BoolT a -> [String] -> Forest PE -> TT a
+ Predicate.Util: TT :: !BoolT a -> ![String] -> !Forest PE -> TT a
- Predicate.Util: [FailT] :: String -> BoolT a
+ Predicate.Util: [FailT] :: !String -> BoolT a
- Predicate.Util: [PresentT] :: a -> BoolT a
+ Predicate.Util: [PresentT] :: !a -> BoolT a
- Predicate.Util: [_tBool] :: TT a -> BoolT a
+ Predicate.Util: [_tBool] :: TT a -> !BoolT a
- Predicate.Util: [_tForest] :: TT a -> Forest PE
+ Predicate.Util: [_tForest] :: TT a -> !Forest PE
- Predicate.Util: [_tStrings] :: TT a -> [String]
+ Predicate.Util: [_tStrings] :: TT a -> ![String]
- Predicate.Util: [oDisp] :: POpts -> Disp
+ Predicate.Util: [oDisp] :: POpts -> !Disp
- Predicate.Util: [oWidth] :: POpts -> Int
+ Predicate.Util: [oWidth] :: POpts -> !Int

Files

predicate-typed.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: cb25822f4cf9d47fb5e8793e47a05aba5041df2929f5497e50d7897f9f1d6c17+-- hash: 91077e765e3f765a00629565212c20b373d1e8cd724f4f9c4f381835f0e4f561  name:           predicate-typed-version:        0.5.1.0+version:        0.6.0.0 synopsis:       Predicates, Refinement types and Dsl description:    Please see the README on GitHub at <https://github.com/gbwey/predicate-typed#readme> category:       Data@@ -54,6 +54,7 @@     , deepseq     , directory     , ghc-prim+    , hashable     , lens     , mtl     , pcre-heavy >=1.0.0.2@@ -91,6 +92,7 @@     , directory     , doctest     , ghc-prim+    , hashable     , lens     , mtl     , pcre-heavy >=1.0.0.2@@ -135,6 +137,7 @@     , deepseq     , directory     , ghc-prim+    , hashable     , lens     , mtl     , pcre-heavy >=1.0.0.2
src/Predicate/Prelude.hs view
@@ -1,3 +1,4 @@+-- add Writer to MonadEval so we dont need to specify [hh pp ...]
 -- the mkNode opts (FailT msg) [msg] .. -- repetitive: needs to add value
 -- no types referring to types otherwise we lose use of _ as Type
 {-# OPTIONS -Wall #-}
@@ -42,6 +43,7 @@   , Desc
   , Desc'
   , Between
+  , BetweenA
   , type (<..>)
   , All
   , Any
@@ -105,6 +107,17 @@   , IsSeparator
   , IsLatin1
 
+  , IsLowerAll
+  , IsUpperAll
+  , IsNumberAll
+  , IsSpaceAll
+  , IsPunctuationAll
+  , IsControlAll
+  , IsHexDigitAll
+  , IsOctDigitAll
+  , IsSeparatorAll
+  , IsLatin1All
+
   -- ** datetime expressions
   , FormatTimeP
   , ParseTimeP
@@ -171,6 +184,7 @@   , ParseJson'
   , ParseJson
   , EncodeJson
+  , EncodeJsonFile
   , ParseJsonFile'
   , ParseJsonFile
 
@@ -201,8 +215,8 @@   , Le
   , Lt
   , Ne
-  , OrdP
   , type (==!)
+  , OrdP
   , OrdA'
   , OrdA
   , OrdI
@@ -254,11 +268,14 @@   , Cycle
   , SplitAts
   , SplitAt
+  , ChunksOf
+  , Rotate
   , Take
   , Drop
   , Min
   , Max
   , Sum
+  , Product
   , IsEmpty
   , Null
   , Null'
@@ -316,8 +333,8 @@   , type (<>)
   , MConcat
   , STimes
-  , Sapa
-  , Sapa'
+  , SapA
+  , SapA'
   , MEmptyT
   , MEmptyT'
   , MEmptyP
@@ -457,8 +474,9 @@   , IsPrefixI
   , IsInfixI
   , IsSuffixI
-  , FromStringP
-  , FromStringP'
+  , ToString
+  , FromString
+  , FromString'
 
   -- ** print expressions
   , PrintF
@@ -558,6 +576,8 @@ import qualified Data.Aeson as A
 import qualified Data.ByteString.Char8 as BS8
 import qualified Data.ByteString.Lazy.Char8 as BL8
+import qualified Data.Text as T
+import qualified Data.Text.Lazy as TL
 
 -- $setup
 -- >>> :set -XDataKinds
@@ -682,6 +702,61 @@   type PP (p <..> q) x = PP (BetweenT p q) x
   eval _ = evalBool (Proxy @(BetweenT p q))
 
+-- | between for tuples
+--
+-- >>> pl @(BetweenA (Fst Id) (Snd Id)) ((1,4),8)
+-- False (8 <= 4)
+-- FalseT
+--
+-- >>> pl @(BetweenA (Fst Id) (Snd Id)) ((1,4),0)
+-- False (1 <= 0)
+-- FalseT
+--
+-- >>> pl @(BetweenA (Fst Id) (Snd Id)) ((1,4),3)
+-- True (1 <= 3 <= 4)
+-- TrueT
+--
+-- >>> pl @(BetweenA (ReadP (Day,Day) "(2017-04-11,2018-12-30)") (ReadP Day Id)) "2018-10-12"
+-- True (2017-04-11 <= 2018-10-12 <= 2018-12-30)
+-- TrueT
+--
+-- >>> pl @(BetweenA (ReadP (Day,Day) "(2017-04-11,2018-12-30)") (ReadP Day Id)) "2019-10-12"
+-- False (2019-10-12 <= 2018-12-30)
+-- FalseT
+--
+-- >>> pl @(BetweenA (ReadP (Day,Day) "(2017-04-11,2018-12-30)") (ReadP Day Id)) "2016-10-12"
+-- False (2017-04-11 <= 2016-10-12)
+-- FalseT
+--
+
+{- too much data mitigated somewhat by Hide
+type BetweenAT p q = '(p,q) >> Between (Fst (Fst Id)) (Snd (Fst Id)) (Snd Id)
+
+instance P (BetweenAT p q) x => P (BetweenA p q) x where
+  type PP (BetweenA p q) x = PP (BetweenAT p q) x
+  eval _ = evalBool (Proxy @(BetweenAT p q))
+-}
+data BetweenA p q
+
+instance (PP p x ~ (a,a')
+       , P q x
+       , PP q x ~ a
+       , Ord a
+       , a ~ a'
+       , Show a
+       , P p x
+       ) => P (BetweenA p q) x where
+  type PP (BetweenA p q) x = Bool
+  eval _ opts x = do
+    let msg0 = "BetweenA"
+    lr <- runPQ msg0 (Proxy @p) (Proxy @q) opts x []
+    pure $ case lr of
+      Left e -> e
+      Right ((p1,p2),q,pp,qq) ->
+        [hh pp, hh qq] & if p1 <= q && q <= p2 then mkNodeB opts True [show p1 <> " <= " <> show q <> " <= " <> show p2]
+        else if p1 > q then mkNodeB opts False [show p1 <> " <= " <> show q]
+        else mkNodeB opts False [show q <> " <= " <> show p2]
+
 -- | similar to 'all'
 --
 -- >>> pl @(All (Between 1 8 Id) Id) [7,3,4,1,2,9,0,1]
@@ -1278,75 +1353,200 @@       Left e -> e
       Right f -> mkNode opts (PresentT (RReplace3 f)) [msg0] [hh pp]
 
+
 -- | a predicate for determining if a string 'Data.Text.IsText' belongs to the given character set
 --
--- >>> pz @IsLower "abc"
+-- >>> pz @IsSpace '\t'
 -- True
 -- TrueT
 --
--- >>> pz @IsLower "abcX"
+-- >>> pz @IsSpace ' '
+-- True
+-- TrueT
+--
+-- >>> pz @IsSpace 'x'
 -- False
 -- FalseT
 --
--- >>> pz @IsLower (T.pack "abcX")
+-- >>> pz @IsLower 'a'
+-- True
+-- TrueT
+--
+-- >>> pz @IsLower 'X'
 -- False
 -- FalseT
 --
--- >>> pz @IsHexDigit "01efA"
+-- >>> pz @IsHexDigit 'A'
 -- True
 -- TrueT
 --
--- >>> pz @IsHexDigit "01egfA"
+-- >>> pz @IsHexDigit 'g'
 -- False
 -- FalseT
 --
 -- | predicate for determining if a string is all lowercase
 --
--- >>> pz @IsLower "abcdef213"
+-- >>> pz @IsLower '1'
 -- False
 -- FalseT
 --
--- >>> pz @IsLower "abcdef"
+-- >>> pz @IsLower 'a'
 -- True
 -- TrueT
 --
--- >>> pz @IsLower ""
+data IsCharSet (cs :: CharSet)
+
+instance (x ~ Char, GetCharSet cs) => P (IsCharSet cs) x where
+  type PP (IsCharSet cs) x = Bool
+  eval _ opts c =
+    let msg0 = "Is" ++ drop 1 (show cs)
+        (cs,f) = getCharSet @cs
+        b = f c
+    in pure $ mkNodeB opts b [msg0 <> show1 opts " | " [c]] []
+
+data IsLower
+type IsLowerT = IsCharSet 'CLower
+
+instance P IsLowerT x => P IsLower x where
+  type PP IsLower x = PP IsLowerT x
+  eval _ = evalBool (Proxy @IsLowerT)
+
+data IsUpper
+type IsUpperT = IsCharSet 'CUpper
+
+instance P IsUpperT x => P IsUpper x where
+  type PP IsUpper x = PP IsUpperT x
+  eval _ = evalBool (Proxy @IsUpperT)
+
+-- | predicate for determining if the string is all digits
+--
+-- >>> pz @IsNumber 'g'
+-- False
+-- FalseT
+--
+-- >>> pz @IsNumber '9'
 -- True
 -- TrueT
 --
--- >>> pz @IsLower "abcdefG"
+data IsNumber
+type IsNumberT = IsCharSet 'CNumber
+instance P IsNumberT x => P IsNumber x where
+  type PP IsNumber x = Bool
+  eval _ = evalBool (Proxy @IsNumberT)
+
+data IsSpace
+type IsSpaceT = IsCharSet 'CSpace
+instance P IsSpaceT x => P IsSpace x where
+  type PP IsSpace x = Bool
+  eval _ = evalBool (Proxy @IsSpaceT)
+
+data IsPunctuation
+type IsPunctuationT = IsCharSet 'CPunctuation
+instance P IsPunctuationT x => P IsPunctuation x where
+  type PP IsPunctuation x = Bool
+  eval _ = evalBool (Proxy @IsPunctuationT)
+
+data IsControl
+type IsControlT = IsCharSet 'CControl
+instance P IsControlT x => P IsControl x where
+  type PP IsControl x = Bool
+  eval _ = evalBool (Proxy @IsControlT)
+
+data IsHexDigit
+type IsHexDigitT = IsCharSet 'CHexDigit
+instance P IsHexDigitT x => P IsHexDigit x where
+  type PP IsHexDigit x = Bool
+  eval _ = evalBool (Proxy @IsHexDigitT)
+
+data IsOctDigit
+type IsOctDigitT = IsCharSet 'COctDigit
+instance P IsOctDigitT x => P IsOctDigit x where
+  type PP IsOctDigit x = Bool
+  eval _ = evalBool (Proxy @IsOctDigitT)
+
+data IsSeparator
+type IsSeparatorT = IsCharSet 'CSeparator
+instance P IsSeparatorT x => P IsSeparator x where
+  type PP IsSeparator x = Bool
+  eval _ = evalBool (Proxy @IsSeparatorT)
+
+data IsLatin1
+type IsLatin1T = IsCharSet 'CLatin1
+instance P IsLatin1T x => P IsLatin1 x where
+  type PP IsLatin1 x = Bool
+  eval _ = evalBool (Proxy @IsLatin1T)
+
+
+
+-- | a predicate for determining if a string 'Data.Text.IsText' belongs to the given character set
+--
+-- >>> pz @IsLowerAll "abc"
+-- True
+-- TrueT
+--
+-- >>> pz @IsLowerAll "abcX"
 -- False
 -- FalseT
 --
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "AbcdE"
--- False ((>>) False | {True (&*) False | (IsLower | "bcdE")})
+-- >>> pz @IsLowerAll (T.pack "abcX")
+-- False
 -- FalseT
 --
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "Abcde"
+-- >>> pz @IsHexDigitAll "01efA"
+-- True
+-- TrueT
+--
+-- >>> pz @IsHexDigitAll "01egfA"
+-- False
+-- FalseT
+--
+-- | predicate for determining if a string is all lowercase
+--
+-- >>> pz @IsLowerAll "abcdef213"
+-- False
+-- FalseT
+--
+-- >>> pz @IsLowerAll "abcdef"
+-- True
+-- TrueT
+--
+-- >>> pz @IsLowerAll ""
+-- True
+-- TrueT
+--
+-- >>> pz @IsLowerAll "abcdefG"
+-- False
+-- FalseT
+--
+-- >>> pl @(Just Uncons >> IsUpper &* IsLowerAll) "AbcdE"
+-- False ((>>) False | {True (&*) False | (IsLowerAll | "bcdE")})
+-- FalseT
+--
+-- >>> pl @(Just Uncons >> IsUpper &* IsLowerAll) "Abcde"
 -- True ((>>) True | {True (&*) True})
 -- TrueT
 --
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "xbcde"
--- False ((>>) False | {IsUpper | "x"})})
+-- >>> pl @(Just Uncons >> IsUpper &* IsLowerAll) "xbcde"
+-- False ((>>) False | {False (&*) True | (IsUpper | "x")})
 -- FalseT
 --
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "X"
+-- >>> pl @(Just Uncons >> IsUpper &* IsLowerAll) "X"
 -- True ((>>) True | {True (&*) True})
 -- TrueT
 --
+data IsCharSetAll (cs :: CharSet)
+
 instance (GetCharSet cs
         , Show a
         , TL.IsText a
-        ) => P (IsCharSet cs) a where
-  type PP (IsCharSet cs) a = Bool
+        ) => P (IsCharSetAll cs) a where
+  type PP (IsCharSetAll cs) a = Bool
   eval _ opts as =
     let b = allOf TL.text f as
-        msg0 = "Is" ++ drop 1 (show cs)
+        msg0 = "Is" ++ drop 1 (show cs) ++ "All"
         (cs,f) = getCharSet @cs
     in pure $ mkNodeB opts b [msg0 <> show1 opts " | " as] []
 
-data IsCharSet (cs :: CharSet)
-
 data CharSet = CLower
              | CUpper
              | CNumber
@@ -1367,6 +1567,8 @@   getCharSet = (CUpper, isUpper)
 instance GetCharSet 'CNumber where
   getCharSet = (CNumber, isNumber)
+instance GetCharSet 'CSpace where
+  getCharSet = (CSpace, isSpace)
 instance GetCharSet 'CPunctuation where
   getCharSet = (CPunctuation, isPunctuation)
 instance GetCharSet 'CControl where
@@ -1380,77 +1582,91 @@ instance GetCharSet 'CLatin1 where
   getCharSet = (CLatin1, isLatin1)
 
-data IsLower
-type IsLowerT = IsCharSet 'CLower
+data IsLowerAll
+type IsLowerAllT = IsCharSetAll 'CLower
 
-instance P IsLowerT x => P IsLower x where
-  type PP IsLower x = PP IsLowerT x
-  eval _ = evalBool (Proxy @IsLowerT)
+instance P IsLowerAllT x => P IsLowerAll x where
+  type PP IsLowerAll x = PP IsLowerAllT x
+  eval _ = evalBool (Proxy @IsLowerAllT)
 
-data IsUpper
-type IsUpperT = IsCharSet 'CUpper
+data IsUpperAll
+type IsUpperAllT = IsCharSetAll 'CUpper
 
-instance P IsUpperT x => P IsUpper x where
-  type PP IsUpper x = PP IsUpperT x
-  eval _ = evalBool (Proxy @IsUpperT)
+instance P IsUpperAllT x => P IsUpperAll x where
+  type PP IsUpperAll x = PP IsUpperAllT x
+  eval _ = evalBool (Proxy @IsUpperAllT)
 
 -- | predicate for determining if the string is all digits
 --
--- >>> pz @IsNumber "213G"
+-- >>> pz @IsNumberAll "213G"
 -- False
 -- FalseT
 --
--- >>> pz @IsNumber "929"
+-- >>> pz @IsNumberAll "929"
 -- True
 -- TrueT
 --
-data IsNumber
-type IsNumberT = IsCharSet 'CNumber
-instance P IsNumberT x => P IsNumber x where
-  type PP IsNumber x = PP IsNumberT x
-  eval _ = evalBool (Proxy @IsNumberT)
+data IsNumberAll
+type IsNumberAllT = IsCharSetAll 'CNumber
+instance P IsNumberAllT x => P IsNumberAll x where
+  type PP IsNumberAll x = Bool
+  eval _ = evalBool (Proxy @IsNumberAllT)
 
-data IsSpace
-type IsSpaceT = IsCharSet 'CSpace
-instance P IsSpaceT x => P IsSpace x where
-  type PP IsSpace x = PP IsSpaceT x
-  eval _ = evalBool (Proxy @IsSpaceT)
+-- | predicate for determining if the string is all spaces
+--
+-- >>> pz @IsSpaceAll "213G"
+-- False
+-- FalseT
+--
+-- >>> pz @IsSpaceAll "    "
+-- True
+-- TrueT
+--
+-- >>> pz @IsSpaceAll ""
+-- True
+-- TrueT
+--
+data IsSpaceAll
+type IsSpaceAllT = IsCharSetAll 'CSpace
+instance P IsSpaceAllT x => P IsSpaceAll x where
+  type PP IsSpaceAll x = Bool
+  eval _ = evalBool (Proxy @IsSpaceAllT)
 
-data IsPunctuation
-type IsPunctuationT = IsCharSet 'CPunctuation
-instance P IsPunctuationT x => P IsPunctuation x where
-  type PP IsPunctuation x = PP IsPunctuationT x
-  eval _ = evalBool (Proxy @IsPunctuationT)
+data IsPunctuationAll
+type IsPunctuationAllT = IsCharSetAll 'CPunctuation
+instance P IsPunctuationAllT x => P IsPunctuationAll x where
+  type PP IsPunctuationAll x = Bool
+  eval _ = evalBool (Proxy @IsPunctuationAllT)
 
-data IsControl
-type IsControlT = IsCharSet 'CControl
-instance P IsControlT x => P IsControl x where
-  type PP IsControl x = PP IsControlT x
-  eval _ = evalBool (Proxy @IsControlT)
+data IsControlAll
+type IsControlAllT = IsCharSetAll 'CControl
+instance P IsControlAllT x => P IsControlAll x where
+  type PP IsControlAll x = Bool
+  eval _ = evalBool (Proxy @IsControlAllT)
 
-data IsHexDigit
-type IsHexDigitT = IsCharSet 'CHexDigit
-instance P IsHexDigitT x => P IsHexDigit x where
-  type PP IsHexDigit x = PP IsHexDigitT x
-  eval _ = evalBool (Proxy @IsHexDigitT)
+data IsHexDigitAll
+type IsHexDigitAllT = IsCharSetAll 'CHexDigit
+instance P IsHexDigitAllT x => P IsHexDigitAll x where
+  type PP IsHexDigitAll x = Bool
+  eval _ = evalBool (Proxy @IsHexDigitAllT)
 
-data IsOctDigit
-type IsOctDigitT = IsCharSet 'COctDigit
-instance P IsOctDigitT x => P IsOctDigit x where
-  type PP IsOctDigit x = PP IsOctDigitT x
-  eval _ = evalBool (Proxy @IsOctDigitT)
+data IsOctDigitAll
+type IsOctDigitAllT = IsCharSetAll 'COctDigit
+instance P IsOctDigitAllT x => P IsOctDigitAll x where
+  type PP IsOctDigitAll x = Bool
+  eval _ = evalBool (Proxy @IsOctDigitAllT)
 
-data IsSeparator
-type IsSeparatorT = IsCharSet 'CSeparator
-instance P IsSeparatorT x => P IsSeparator x where
-  type PP IsSeparator x = PP IsSeparatorT x
-  eval _ = evalBool (Proxy @IsSeparatorT)
+data IsSeparatorAll
+type IsSeparatorAllT = IsCharSetAll 'CSeparator
+instance P IsSeparatorAllT x => P IsSeparatorAll x where
+  type PP IsSeparatorAll x = Bool
+  eval _ = evalBool (Proxy @IsSeparatorAllT)
 
-data IsLatin1
-type IsLatin1T = IsCharSet 'CLatin1
-instance P IsLatin1T x => P IsLatin1 x where
-  type PP IsLatin1 x = PP IsLatin1T x
-  eval _ = evalBool (Proxy @IsLatin1T)
+data IsLatin1All
+type IsLatin1AllT = IsCharSetAll 'CLatin1
+instance P IsLatin1AllT x => P IsLatin1All x where
+  type PP IsLatin1All x = Bool
+  eval _ = evalBool (Proxy @IsLatin1AllT)
 
 
 -- | converts a string 'Data.Text.Lens.IsText' value to lower case
@@ -1496,8 +1712,8 @@ --
 data Inits
 
-instance Show a => P Inits [a] where
-  type PP Inits [a] = [[a]]
+instance ([a] ~ x, Show a) => P Inits x where
+  type PP Inits x = [x]
   eval _ opts as =
     let msg0 = "Inits"
         xs = inits as
@@ -1515,8 +1731,8 @@ --
 data Tails
 
-instance Show a => P Tails [a] where
-  type PP Tails [a] = [[a]]
+instance ([a] ~ x, Show a) => P Tails x where
+  type PP Tails x = [x]
   eval _ opts as =
     let msg0 = "Tails"
         xs = tails as
@@ -1885,6 +2101,25 @@         v = sum as
     in pure $ mkNode opts (PresentT v) [show01 opts msg0 v as] []
 
+-- | similar to 'product'
+--
+-- >>> pz @Product [10,4,5,12,3,4]
+-- Present 28800
+-- PresentT 28800
+--
+-- >>> pz @Product []
+-- Present 1
+-- PresentT 1
+--
+data Product
+
+instance (Num a, Show a) => P Product [a] where
+  type PP Product [a] = a
+  eval _ opts as =
+    let msg0 = "Product"
+        v = product as
+    in pure $ mkNode opts (PresentT v) [show01 opts msg0 v as] []
+
 -- | similar to 'minimum'
 --
 -- >>> pz @Min [10,4,5,12,3,4]
@@ -2367,23 +2602,23 @@ -- | 'fromString' function where you need to provide the type \'t\' of the result
 --
 -- >>> :set -XFlexibleContexts
--- >>> pz @(FromStringP (Identity _) Id) "abc"
+-- >>> pz @(FromString (Identity _) Id) "abc"
 -- Present Identity "abc"
 -- PresentT (Identity "abc")
 --
--- >>> pz @(FromStringP (Seq.Seq Char) Id) "abc"
+-- >>> pz @(FromString (Seq.Seq Char) Id) "abc"
 -- Present fromList "abc"
 -- PresentT (fromList "abc")
-data FromStringP' t s
+data FromString' t s
 
 instance (P s a
         , PP s a ~ String
         , Show (PP t a)
         , IsString (PP t a)
-        ) => P (FromStringP' t s) a where
-  type PP (FromStringP' t s) a = PP t a
+        ) => P (FromString' t s) a where
+  type PP (FromString' t s) a = PP t a
   eval _ opts a = do
-    let msg0 = "FromStringP"
+    let msg0 = "FromString"
     ss <- eval (Proxy @s) opts a
     pure $ case getValueLR opts msg0 ss [] of
       Left e -> e
@@ -2391,11 +2626,11 @@         let b = fromString @(PP t a) s
         in mkNode opts (PresentT b) [msg0 <> show0 opts " " b] [hh ss]
 
-data FromStringP (t :: Type) p
-type FromStringPT (t :: Type) p = FromStringP' (Hole t) p
+data FromString (t :: Type) p
+type FromStringPT (t :: Type) p = FromString' (Hole t) p
 
-instance P (FromStringPT t p) x => P (FromStringP t p) x where
-  type PP (FromStringP t p) x = PP (FromStringPT t p) x
+instance P (FromStringPT t p) x => P (FromString t p) x where
+  type PP (FromString t p) x = PP (FromStringPT t p) x
   eval _ = eval (Proxy @(FromStringPT t p))
 
 
@@ -2804,7 +3039,7 @@     pure $ case lr of
       Left e -> e
       Right (ns,p,nn,pp) ->
-        let zs = foldr (\n k s -> let (a,b) = splitAt (fromIntegral n) s
+        let zs = foldr (\n k s -> let (a,b) = splitAtNeg (fromIntegral n) s
                               in a:k b
                    ) (\as -> if null as then [] else [as]) ns p
         in mkNode opts (PresentT zs) [show01' opts msg0 zs "ns=" ns <> show1 opts " | " p] [hh nn, hh pp]
@@ -2827,6 +3062,10 @@ -- Present ("hell","o world")
 -- PresentT ("hell","o world")
 --
+-- >>> pz @(SplitAt (Negate 2) Id) "hello world"
+-- Present ("hello wor","ld")
+-- PresentT ("hello wor","ld")
+--
 data SplitAt n p
 
 instance (PP p a ~ [b]
@@ -2843,10 +3082,13 @@       Left e -> e -- (Left e, tt')
       Right (fromIntegral -> n,p,pp,qq) ->
         let msg1 = msg0 <> show0 opts " " n <> show0 opts " " p
-            (x,y) = splitAt n p
-            ret = (x,y)
+            ret = splitAtNeg n p
        in mkNode opts (PresentT ret) [show01' opts msg1 ret "n=" n <> show1 opts " | " p] [hh pp, hh qq]
 
+splitAtNeg :: Int -> [a] -> ([a], [a])
+splitAtNeg n as = splitAt (if n<0 then (length as + n) else n) as
+
+
 data Take n p
 type TakeT n p = Fst (SplitAt n p)
 
@@ -3087,42 +3329,42 @@ infix 4 >
 
 instance P (Cmp 'CGt p q) x => P (p > q) x where
-  type PP (p > q) x = PP (Cmp 'CGt p q) x
+  type PP (p > q) x = Bool
   eval _ = evalBool (Proxy @(Cmp 'CGt p q))
 
 data p >= q
 infix 4 >=
 
 instance P (Cmp 'CGe p q) x => P (p >= q) x where
-  type PP (p >= q) x = PP (Cmp 'CGe p q) x
+  type PP (p >= q) x = Bool
   eval _ = evalBool (Proxy @(Cmp 'CGe p q))
 
 data p == q
 infix 4 ==
 
 instance P (Cmp 'CEq p q) x => P (p == q) x where
-  type PP (p == q) x = PP (Cmp 'CEq p q) x
+  type PP (p == q) x = Bool
   eval _ = evalBool (Proxy @(Cmp 'CEq p q))
 
 data p <= q
 infix 4 <=
 
 instance P (Cmp 'CLe p q) x => P (p <= q) x where
-  type PP (p <= q) x = PP (Cmp 'CLe p q) x
+  type PP (p <= q) x = Bool
   eval _ = evalBool (Proxy @(Cmp 'CLe p q))
 
 data p < q
 infix 4 <
 
 instance P (Cmp 'CLt p q) x => P (p < q) x where
-  type PP (p < q) x = PP (Cmp 'CLt p q) x
+  type PP (p < q) x = Bool
   eval _ = evalBool (Proxy @(Cmp 'CLt p q))
 
 data p /= q
 infix 4 /=
 
 instance P (Cmp 'CNe p q) x => P (p /= q) x where
-  type PP (p /= q) x = PP (Cmp 'CNe p q) x
+  type PP (p /= q) x = Bool
   eval _ = evalBool (Proxy @(Cmp 'CNe p q))
 
 --type p + q = Bin 'BAdd p q
@@ -3154,42 +3396,42 @@ infix 4 >~
 
 instance P (CmpI 'CGt p q) x => P (p >~ q) x where
-  type PP (p >~ q) x = PP (CmpI 'CGt p q) x
+  type PP (p >~ q) x = Bool
   eval _ = evalBool (Proxy @(CmpI 'CGt p q))
 
 data p >=~ q
 infix 4 >=~
 
 instance P (CmpI 'CGe p q) x => P (p >=~ q) x where
-  type PP (p >=~ q) x = PP (CmpI 'CGe p q) x
+  type PP (p >=~ q) x = Bool
   eval _ = evalBool (Proxy @(CmpI 'CGe p q))
 
 data p ==~ q
 infix 4 ==~
 
 instance P (CmpI 'CEq p q) x => P (p ==~ q) x where
-  type PP (p ==~ q) x = PP (CmpI 'CEq p q) x
+  type PP (p ==~ q) x = Bool
   eval _ = evalBool (Proxy @(CmpI 'CEq p q))
 
 data p <=~ q
 infix 4 <=~
 
 instance P (CmpI 'CLe p q) x => P (p <=~ q) x where
-  type PP (p <=~ q) x = PP (CmpI 'CLe p q) x
+  type PP (p <=~ q) x = Bool
   eval _ = evalBool (Proxy @(CmpI 'CLe p q))
 
 data p <~ q
 infix 4 <~
 
 instance P (CmpI 'CLt p q) x => P (p <~ q) x where
-  type PP (p <~ q) x = PP (CmpI 'CLt p q) x
+  type PP (p <~ q) x = Bool
   eval _ = evalBool (Proxy @(CmpI 'CLt p q))
 
 data p /=~ q
 infix 4 /=~
 
 instance P (CmpI 'CNe p q) x => P (p /=~ q) x where
-  type PP (p /=~ q) x = PP (CmpI 'CNe p q) x
+  type PP (p /=~ q) x = Bool
   eval _ = evalBool (Proxy @(CmpI 'CNe p q))
 
 
@@ -5461,7 +5703,7 @@ data Null
 type NullT = Null' Id
 instance P NullT a => P Null a where
-  type PP Null a = PP NullT a
+  type PP Null a = Bool
   eval _ = evalBool (Proxy @NullT)
 
 -- | similar to 'enumFromTo'
@@ -5578,7 +5820,10 @@ -- Present 'g'
 -- PresentT 'g'
 --
-
+-- >>> pz @(Dup >> ScanN 4 Id (Pred Id *** Succ Id)) 'g'
+-- Present [('g','g'),('f','h'),('e','i'),('d','j'),('c','k')]
+-- PresentT [('g','g'),('f','h'),('e','i'),('d','j'),('c','k')]
+--
 data Scanl p q r
 -- scanr :: (a -> b -> b) -> b -> [a] -> [b]
 -- result is scanl but signature is flipped ((a,b) -> b) -> b -> [a] -> [b]
@@ -6065,14 +6310,14 @@ type EvenT = Mod I 2 == 0
 
 instance P EvenT x => P Even x where
-  type PP Even x = PP EvenT x
+  type PP Even x = Bool
   eval _ = evalBool (Proxy @EvenT)
 
 data Odd
 type OddT = Mod I 2 == 1
 
 instance P OddT x => P Odd x where
-  type PP Odd x = PP OddT x
+  type PP Odd x = Bool
   eval _ = evalBool (Proxy @OddT)
 
 
@@ -6280,8 +6525,8 @@ 
 data Guards (ps :: [(k,k1)])
 
-instance (GetLen ps, P (GuardsImpl (LenT ps) ps) [a]) => P (Guards ps) [a] where
-  type PP (Guards ps) [a] = PP (GuardsImpl (LenT ps) ps) [a]
+instance ([a] ~ x, GetLen ps, P (GuardsImpl (LenT ps) ps) x) => P (Guards ps) x where
+  type PP (Guards ps) x = PP (GuardsImpl (LenT ps) ps) x
   eval _ opts as = do
     let msg0 = "Guards"
         n = getLen @ps
@@ -6293,9 +6538,9 @@ badLength :: (Foldable t, Show n, Num n) => t a -> n -> String
 badLength as n = ":invalid length(" <> show (length as) <> ") expected " ++ show (n+0)
 
-instance Show a
-         => P (GuardsImpl n ('[] :: [(k,k1)])) [a] where
-  type PP (GuardsImpl n ('[] :: [(k,k1)])) [a] = [a]
+instance ([a] ~ x, Show a)
+         => P (GuardsImpl n ('[] :: [(k,k1)])) x where
+  type PP (GuardsImpl n ('[] :: [(k,k1)])) x = x
   eval _ opts as =
     let msg0 = "Guards"
     in if not (null as) then errorInProgram $ "GuardsImpl base case has extra data " ++ show as
@@ -6310,8 +6555,9 @@         , P (GuardsImpl n ps) [a]
         , PP (GuardsImpl n ps) [a] ~ [a]
         , Show a
-        ) => P (GuardsImpl n ('(prt,p) ': ps)) [a] where
-  type PP (GuardsImpl n ('(prt,p) ': ps)) [a] = [a]
+        , [a] ~ x
+        ) => P (GuardsImpl n ('(prt,p) ': ps)) x where
+  type PP (GuardsImpl n ('(prt,p) ': ps)) x = x
   eval _ opts as' = do
      let cpos = n-pos-1
          msgbase1 = "Guard(" <> show cpos <> ")"
@@ -6389,11 +6635,12 @@ --
 data Bools (ps :: [(k,k1)])
 
-instance (GetLen ps
-        , P (BoolsImpl (LenT ps) ps) [a]
-        , PP (BoolsImpl (LenT ps) ps) [a] ~ Bool
-        ) => P (Bools ps) [a] where
-  type PP (Bools ps) [a] = Bool
+instance ([a] ~ x
+        , GetLen ps
+        , P (BoolsImpl (LenT ps) ps) x
+        , PP (BoolsImpl (LenT ps) ps) x ~ Bool
+        ) => P (Bools ps) x where
+  type PP (Bools ps) x = Bool
   eval _ opts as = do
     let msg0 = "Bools"
         msg1 = "Bool("++show n++")"
@@ -6410,8 +6657,9 @@ 
 instance (KnownNat n
         , Show a
-        ) => P (BoolsImpl n ('[] :: [(k,k1)])) [a] where
-  type PP (BoolsImpl n ('[] :: [(k,k1)])) [a] = Bool
+        , [a] ~ x
+        ) => P (BoolsImpl n ('[] :: [(k,k1)])) x where
+  type PP (BoolsImpl n ('[] :: [(k,k1)])) x = Bool
   eval _ opts as =
     let msg0 = "Bool(" <> show n <> ")"
         n :: Int = nat @n
@@ -6424,11 +6672,12 @@         , GetLen ps
         , P p a
         , PP p a ~ Bool
-        , P (BoolsImpl n ps) [a]
+        , P (BoolsImpl n ps) x
         , PP (BoolsImpl n ps) [a] ~ Bool
 --        , Show a
-        ) => P (BoolsImpl n ('(prt,p) ': ps)) [a] where
-  type PP (BoolsImpl n ('(prt,p) ': ps)) [a] = Bool
+        , [a] ~ x
+        ) => P (BoolsImpl n ('(prt,p) ': ps)) x where
+  type PP (BoolsImpl n ('(prt,p) ': ps)) x = Bool
   eval _ opts as' = do
      let cpos = n-pos-1
          msgbase1 = "Bool(" <> showIndex cpos <> ")"
@@ -6458,7 +6707,7 @@ data BoolsQuick (prt :: k) (ps :: [k1])
 type BoolsQuickT (prt :: k) (ps :: [k1]) = Bools (ToGuardsT prt ps)
 
--- why do we need this? when BoolsN works without
+-- why do we need this? when BoolsN works without [use the x ~ [a] trick in BoolsN]
 instance (PP (Bools (ToGuardsT prt ps)) x ~ Bool
         , P (BoolsQuickT prt ps) x
           ) => P (BoolsQuick prt ps) x where
@@ -6478,8 +6727,8 @@ data BoolsN prt (n :: Nat) (p :: k1)
 type BoolsNT prt (n :: Nat) (p :: k1) = Bools (ToGuardsT prt (RepeatT n p))
 
-instance P (BoolsNT prt n p) [a] => P (BoolsN prt n p) [a] where
-  type PP (BoolsN prt n p) [a] = PP (BoolsNT prt n p) [a]
+instance (x ~ [a], P (BoolsNT prt n p) x) => P (BoolsN prt n p) x where
+  type PP (BoolsN prt n p) x = PP (BoolsNT prt n p) x
   eval _ = evalBool (Proxy @(BoolsNT prt n p))
 
 -- | if a predicate fails then then the corresponding symbol and value will be passed to the print function
@@ -6498,10 +6747,11 @@ --
 data GuardsDetailImpl (ps :: [(k,k1)])
 
-instance (GetLen ps
-        , P (GuardsImplX (LenT ps) ps) [a]
-        ) => P (GuardsDetailImpl ps) [a] where
-  type PP (GuardsDetailImpl ps) [a] = PP (GuardsImplX (LenT ps) ps) [a]
+instance ([a] ~ x
+        , GetLen ps
+        , P (GuardsImplX (LenT ps) ps) x
+        ) => P (GuardsDetailImpl ps) x where
+  type PP (GuardsDetailImpl ps) x = PP (GuardsImplX (LenT ps) ps) x
   eval _ opts as = do
     let msg0 = "Guards"
         n = getLen @ps
@@ -6512,9 +6762,9 @@ 
 data GuardsImplX (n :: Nat) (os :: [(k,k1)])
 
-instance Show a
-        => P (GuardsImplX n ('[] :: [(k,k1)])) [a] where
-  type PP (GuardsImplX n ('[] :: [(k,k1)])) [a] = [a]
+instance ([a] ~ x, Show a)
+        => P (GuardsImplX n ('[] :: [(k,k1)])) x where
+  type PP (GuardsImplX n ('[] :: [(k,k1)])) x = x
   eval _ opts as =
     let msg0 = "Guards"
         -- n :: Int = nat @n
@@ -6530,8 +6780,9 @@         , P (GuardsImplX n ps) [a]
         , PP (GuardsImplX n ps) [a] ~ [a]
         , Show a
-        ) => P (GuardsImplX n ('(prt,p) ': ps)) [a] where
-  type PP (GuardsImplX n ('(prt,p) ': ps)) [a] = [a]
+        , [a] ~ x
+        ) => P (GuardsImplX n ('(prt,p) ': ps)) x where
+  type PP (GuardsImplX n ('(prt,p) ': ps)) x = x
   eval _ opts as' = do
      let cpos = n-pos-1
          msgbase1 = "Guard(" <> showIndex cpos <> ")"
@@ -6580,8 +6831,8 @@ data GuardsN prt (n :: Nat) p
 type GuardsNT prt (n :: Nat) p = Guards (ToGuardsT prt (RepeatT n p))
 
-instance P (GuardsNT prt n p) [a] => P (GuardsN prt n p) [a] where
-  type PP (GuardsN prt n p) [a] = PP (GuardsNT prt n p) [a]
+instance (x ~ [a], P (GuardsNT prt n p) x) => P (GuardsN prt n p) x where
+  type PP (GuardsN prt n p) x = PP (GuardsNT prt n p) x
   eval _ = eval (Proxy @(GuardsNT prt n p))
 
 -- | \'p\' is the predicate and on failure of the predicate runs \'prt\'
@@ -6890,11 +7141,6 @@         let b = not p
         in mkNodeB opts b [msg0 <> " " <> topMessage pp] [hh pp]
 
-type OrdP p q = p ==! q
-
-data p ==! q
-infix 4 ==!
-
 -- | similar to 'compare'
 --
 -- >>> pz @(Fst Id ==! Snd Id) (10,9)
@@ -6917,14 +7163,11 @@ -- Present EQ
 -- PresentT EQ
 --
---type OrdA' p q = (Fst Id >> p) ==! (Snd Id >> q)
---type OrdA p = OrdA' p p
 
-data OrdA p
+data p ==! q
+infix 4 ==!
 
-instance P (OrdA' p p) x => P (OrdA p) x where
-  type PP (OrdA p) x = PP (OrdA' p p) x
-  eval _ = eval (Proxy @(OrdA' p p))
+type OrdP p q = p ==! q
 
 instance (Ord (PP p a)
         , PP p a ~ PP q a
@@ -6942,6 +7185,12 @@         let d = compare p q
         in mkNode opts (PresentT d) [msg0 <> " " <> show p <> " " <> prettyOrd d <> show0 opts " " q] [hh pp, hh qq]
 
+data OrdA p
+
+instance P (OrdA' p p) x => P (OrdA p) x where
+  type PP (OrdA p) x = PP (OrdA' p p) x
+  eval _ = eval (Proxy @(OrdA' p p))
+
 data OrdA' p q
 type OrdAT' p q = (Fst Id >> p) ==! (Snd Id >> q)
 
@@ -7170,8 +7419,9 @@ instance (a ~ GE.Item t
         , Show t
         , GE.IsList t
-        ) => P (FromList t) [a] where
-  type PP (FromList t) [a] = t
+        , [a] ~ x
+        ) => P (FromList t) x where
+  type PP (FromList t) x = t
   eval _ opts as =
     let msg0 = "FromList"
         z = GE.fromList (as :: [GE.Item t]) :: t
@@ -7924,8 +8174,11 @@ data Para (ps :: [k])
 
 -- passthru but adds the length of ps (replaces LenT in the type synonym to avoid type synonyms being expanded out
-instance (GetLen ps, P (ParaImpl (LenT ps) ps) [a]) => P (Para ps) [a] where
-  type PP (Para ps) [a] = PP (ParaImpl (LenT ps) ps) [a]
+instance ([a] ~ x
+        , GetLen ps
+        , P (ParaImpl (LenT ps) ps) x
+        ) => P (Para ps) x where
+  type PP (Para ps) x = PP (ParaImpl (LenT ps) ps) x
   eval _ opts as = do
     let msg0 = "Para"
         n = getLen @ps
@@ -7934,10 +8187,10 @@        in pure $ mkNode opts (FailT msg1) [msg1] []
     else eval (Proxy @(ParaImpl (LenT ps) ps)) opts as
 
--- only allow non empty lists
+-- only allow non empty lists -- might need [a] ~ x but it seems fine
 instance GL.TypeError ('GL.Text "ParaImpl '[] invalid: requires at least one value in the list")
-   => P (ParaImpl n ('[] :: [k])) [a] where
-  type PP (ParaImpl n ('[] :: [k])) [a] = Void
+   => P (ParaImpl n ('[] :: [k])) x where
+  type PP (ParaImpl n ('[] :: [k])) x = Void
   eval _ _ _ = errorInProgram "ParaImpl empty list"
 
 instance (Show (PP p a)
@@ -8006,10 +8259,11 @@ --
 data ParaN (n :: Nat) p
 
-instance ( P (ParaImpl (LenT (RepeatT n p)) (RepeatT n p)) [a]
+instance ( P (ParaImpl (LenT (RepeatT n p)) (RepeatT n p)) x
          , GetLen (RepeatT n p)
-         ) => P (ParaN n p) [a] where
-  type PP (ParaN n p) [a] = PP (Para (RepeatT n p)) [a]
+         , x ~ [a]
+         ) => P (ParaN n p) x where
+  type PP (ParaN n p) x = PP (Para (RepeatT n p)) x
   eval _ = eval (Proxy @(Para (RepeatT n p)))
 
 -- | 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
@@ -8551,11 +8805,11 @@ -- Present (Sum {getSum = 22},"def_XYZ")
 -- PresentT (Sum {getSum = 22},"def_XYZ")
 --
--- >>> pz @(Sapa' (SG.Max _)) (10,12)
+-- >>> pz @(SapA' (SG.Max _)) (10,12)
 -- Present Max {getMax = 12}
 -- PresentT (Max {getMax = 12})
 --
--- >>> pz @(Sapa' (SG.Sum _)) (10,12)
+-- >>> pz @(SapA' (SG.Sum _)) (10,12)
 -- Present Sum {getSum = 22}
 -- PresentT (Sum {getSum = 22})
 --
@@ -8578,19 +8832,19 @@         let d = p <> q
         in mkNode opts (PresentT d) [show p <> " <> " <> show q <> " = " <> show d] [hh pp, hh qq]
 
-data Sapa' (t :: Type)
-type SapaT' (t :: Type) = Wrap t (Fst Id) <> Wrap t (Snd Id)
+data SapA' (t :: Type)
+type SapAT' (t :: Type) = Wrap t (Fst Id) <> Wrap t (Snd Id)
 
-instance P (SapaT' t) x => P (Sapa' t) x where
-  type PP (Sapa' t) x = PP (SapaT' t) x
-  eval _ = eval (Proxy @(SapaT' t))
+instance P (SapAT' t) x => P (SapA' t) x where
+  type PP (SapA' t) x = PP (SapAT' t) x
+  eval _ = eval (Proxy @(SapAT' t))
 
-data Sapa
-type SapaT = Fst Id <> Snd Id
+data SapA
+type SapAT = Fst Id <> Snd Id
 
-instance P SapaT x => P Sapa x where
-  type PP Sapa x = PP SapaT x
-  eval _ = eval (Proxy @SapaT)
+instance P SapAT x => P SapA x where
+  type PP SapA x = PP SapAT x
+  eval _ = eval (Proxy @SapAT)
 
 -- | uses inductive tuples to replace variable arguments
 --
@@ -10067,10 +10321,22 @@ -- Error ParseJson (Int,[Char])([10,"abc",...) Error in $
 -- FailT "ParseJson (Int,[Char])([10,\"abc\",...) Error in $"
 --
+-- >>> pl @(ParseJson (Int,Bool) (FromString _ Id)) ("[1,true]" :: String)
+-- Present (1,True) (ParseJson (Int,Bool) (1,True))
+-- PresentT (1,True)
+--
+-- >>> pl @(ParseJson (Int,Bool) Id) (A.encode (1,True))
+-- Present (1,True) (ParseJson (Int,Bool) (1,True))
+-- PresentT (1,True)
+--
+-- >>> pl @(ParseJson () Id) "[1,true]"
+-- Error ParseJson ()([1,true]) Error in $
+-- FailT "ParseJson ()([1,true]) Error in $"
+--
 data ParseJson' t p
 
 instance (P p x
-        , PP p x ~ String
+        , PP p x ~ BL8.ByteString
         , Typeable (PP t x)
         , Show (PP t x)
         , A.FromJSON (PP t x)
@@ -10084,10 +10350,10 @@       Left e -> e
       Right s ->
         let hhs = [hh pp]
-            msg1 = msg0 <> "(" ++ litL 10 s ++ ")"
-        in case A.eitherDecodeStrict' (BS8.pack s) of
+            msg1 = msg0 <> "(" ++ litBL 10 s ++ ")"
+        in case A.eitherDecode' s of
            Right b -> mkNode opts (PresentT b) [msg0 <> " " ++ showL 30 b] hhs
-           Left e -> mkNode opts (FailT (msg1 <> " " <> takeWhile (/=':') e)) [msg0 <> " failed " <> e <> " | " <> litL 100 s] hhs
+           Left e -> mkNode opts (FailT (msg1 <> " " <> takeWhile (/=':') e) ) [msg0 <> " failed " <> e <> " | " <> litBL 100 s] hhs
 
 data ParseJson (t :: Type) p
 type ParseJsonT (t :: Type) p = ParseJson' (Hole t) p
@@ -10096,25 +10362,6 @@   type PP (ParseJson t p) x = PP (ParseJsonT t p) x
   eval _ = eval (Proxy @(ParseJsonT t p))
 
--- | encode json
---
--- >>> pl @(EncodeJson Id) (10,"def")
--- Present "[10,\"def\"]" (EncodeJson [10,"def"])
--- PresentT "[10,\"def\"]"
---
-data EncodeJson p
-
-instance (A.ToJSON (PP p x), P p x) => P (EncodeJson p) x where
-  type PP (EncodeJson p) x = String
-  eval _ opts x = do
-    let msg0 = "EncodeJson"
-    pp <- eval (Proxy @p) opts x
-    pure $ case getValueLR opts msg0 pp [] of
-      Left e -> e
-      Right p ->
-        let d = BL8.unpack (A.encode p)
-        in mkNode opts (PresentT d) [msg0 <> showLit0 opts " " d] [hh pp]
-
 -- | parse a json file
 data ParseJsonFile' t p
 
@@ -10141,10 +10388,11 @@         pure $ case mb of
           Nothing -> mkNode opts (FailT (msg1 <> " must run in IO")) [msg1 <> " must run in IO"] hhs
           Just Nothing -> mkNode opts (FailT (msg1 <> " file doesn't exist")) [msg1 <> " does not exist"] hhs
-          Just (Just bs) ->
-            case A.eitherDecodeStrict' bs of
-               Right b -> mkNode opts (PresentT b) [msg1 <> " " ++ show b] hhs
-               Left e -> mkNode opts (FailT (msg1 <> " " <> takeWhile (/=':') e)) [msg1 <> " failed " <> litL 100 e] hhs
+          Just (Just s) ->
+            case A.eitherDecodeStrict' s of
+               Right b -> mkNode opts (PresentT b) [msg1 <> " " ++ showL 30 b] hhs
+--                Left e -> mkNode opts (FailT (msg1 <> " " <> takeWhile (/=':') e)) [msg1 <> " failed " <> litL 100 e] hhs
+               Left e -> mkNode opts (FailT (msg1 <> " " <> takeWhile (/=':') e)) [msg0 <> " failed " <> e <> " | " <> litBS 100 s] hhs
 
 data ParseJsonFile (t :: Type) p
 type ParseJsonFileT (t :: Type) p = ParseJsonFile' (Hole t) p
@@ -10153,6 +10401,55 @@   type PP (ParseJsonFile t p) x = PP (ParseJsonFileT t p) x
   eval _ = eval (Proxy @(ParseJsonFileT t p))
 
+-- | encode json
+--
+-- >>> pl @(EncodeJson Id) (10,"def")
+-- Present "[10,\"def\"]" (EncodeJson [10,"def"])
+-- PresentT "[10,\"def\"]"
+--
+-- >>> pl @(EncodeJson Id >> ParseJson (Int,Bool) Id) (1,True)
+-- Present (1,True) ((>>) (1,True) | {ParseJson (Int,Bool) (1,True)})
+-- PresentT (1,True)
+--
+-- >>> pl @(ParseJson ([String], These Int ()) (EncodeJson Id)) (["abc","def"],This 110)
+-- Present (["abc","def"],This 110) (ParseJson ([[Char]],(These Int ())) (["abc","def"],This 110))
+-- PresentT (["abc","def"],This 110)
+--
+data EncodeJson p
+
+instance (A.ToJSON (PP p x), P p x) => P (EncodeJson p) x where
+  type PP (EncodeJson p) x = BL8.ByteString
+  eval _ opts x = do
+    let msg0 = "EncodeJson"
+    pp <- eval (Proxy @p) opts x
+    pure $ case getValueLR opts msg0 pp [] of
+      Left e -> e
+      Right p ->
+        let d = A.encode p
+        in mkNode opts (PresentT d) [msg0 <> showLit0 opts " " (litBL 50 d)] [hh pp]
+
+-- | encode a json file
+data EncodeJsonFile p q
+
+instance (PP p x ~ String
+        , P p x
+        , A.ToJSON (PP q x)
+        , P q x
+        ) => P (EncodeJsonFile p q) x where
+  type PP (EncodeJsonFile p q) x = ()
+  eval _ opts x = do
+    let msg0 = "EncodeJsonFile"
+    lr <- runPQ msg0 (Proxy @p) (Proxy @q) opts x []
+    case lr of
+      Left e -> pure e
+      Right (p,q,pp,qq) -> do
+        let d = A.encode q
+            hhs = [hh pp, hh qq]
+        mb <- runIO $ BL8.writeFile p d
+        pure $ case mb of
+          Nothing -> mkNode opts (FailT (msg0 <> " must run in IO")) [msg0 <> " must run in IO"] hhs
+          Just () -> mkNode opts (PresentT ()) [msg0 <> showLit0 opts " " (litBL 50 d)] hhs
+
 -- | uncurry experiment
 --
 -- >>> pl @(Uncurry Between (ReadP (Day,Day) "(2017-04-11,2018-12-30)") (ReadP Day Id)) "2019-10-12"
@@ -10196,18 +10493,6 @@ -- False ((>>) False | {False (&*) True | (4 > 4)})
 -- FalseT
 --
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "Cabc"
--- True ((>>) True | {True (&*) True})
--- TrueT
---
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "CabD"
--- False ((>>) False | {True (&*) False | (IsLower | "abD")})
--- FalseT
---
--- >>> pl @(Just Uncons >> ('[Id] >> IsUpper) &* IsLower) "2abd"
--- False ((>>) False | {IsUpper | "2"})})
--- FalseT
---
 data AndA p q r
 instance (PP r x ~ (a,b)
         , PP p a ~ Bool
@@ -10307,3 +10592,74 @@   type PP (p |+ q) x = PP (OrAT p q) x
   eval _ = evalBool (Proxy @(OrAT p q))
 
+-- | very simple conversion to a string
+data ToString p
+instance (ToStringC (PP p x), P p x) => P (ToString p) x where
+  type PP (ToString p) x = String
+  eval _ opts x = do
+    let msg0 = "ToString"
+    pp <- eval (Proxy @p) opts x
+    pure $ case getValueLR opts msg0 pp [] of
+      Left e -> e
+      Right p ->
+        let d = toStringC p
+        in mkNode opts (PresentT d) [msg0] [hh pp]
+
+class ToStringC a where
+  toStringC :: a -> String
+instance ToStringC String where
+  toStringC = id
+instance ToStringC T.Text where
+  toStringC = T.unpack
+instance ToStringC TL.Text where
+  toStringC = TL.unpack
+instance ToStringC BL8.ByteString where
+  toStringC = BL8.unpack
+instance ToStringC BS8.ByteString where
+  toStringC = BS8.unpack
+
+-- | splits a list pointed to by \'p\' into lists of size \'n\'
+--
+-- >>> pz @(ChunksOf 2 Id) "abcdef"
+-- Present ["ab","cd","ef"]
+-- PresentT ["ab","cd","ef"]
+--
+-- >>> pz @(ChunksOf 2 Id) "abcdefg"
+-- Present ["ab","cd","ef","g"]
+-- PresentT ["ab","cd","ef","g"]
+--
+-- >>> pz @(ChunksOf 2 Id) ""
+-- Present []
+-- PresentT []
+--
+-- >>> pz @(ChunksOf 2 Id) "a"
+-- Present ["a"]
+-- PresentT ["a"]
+--
+data ChunksOf n p
+
+instance (PP p a ~ [b]
+        , P n a
+        , P p a
+        , Show b
+        , Integral (PP n a)
+        ) => P (ChunksOf n p) a where
+  type PP (ChunksOf n p) a = [PP p a]
+  eval _ opts a = do
+    let msg0 = "ChunksOf"
+    lr <- runPQ msg0 (Proxy @n) (Proxy @p) opts a []
+    pure $ case lr of
+      Left e -> e
+      Right (fromIntegral -> n,p,pp,qq) ->
+        let hhs = [hh pp, hh qq]
+            msg1 = msg0 <> show0 opts " " n <> show0 opts " " p
+        in if n <= 0 then mkNode opts (FailT (msg0 <> " n<1")) [msg1] hhs
+           else let ret = unfoldr (\s -> if null s then Nothing else Just $ splitAt n s) p
+                in mkNode opts (PresentT ret) [show01' opts msg1 ret "n=" n <> show1 opts " | " p] hhs
+
+data Rotate n p
+type RotateT n p = SplitAt n p >> Swap >> First Reverse >> SapA
+
+instance P (RotateT n p) x => P (Rotate n p) x where
+  type PP (Rotate n p) x = PP (RotateT n p) x
+  eval _ = eval (Proxy @(RotateT n p))
src/Predicate/Refined.hs view
@@ -76,6 +76,7 @@ import Data.Semigroup ((<>))
 import Data.String
 import Data.Maybe
+import Data.Hashable (Hashable(..))
 
 -- $setup
 -- >>> :set -XDataKinds
@@ -236,6 +237,12 @@             Nothing -> fail $ "Refined:" ++ show bp ++ "\n" ++ e
             Just r -> return r
   put (Refined r) = B.put @a r
+
+-- | 'Hashable' instance for 'Refined'
+instance ( RefinedC p a
+         , Hashable a
+         ) => Hashable (Refined p a) where
+  hashWithSalt s (Refined a) = s + hash a
 
 -- | 'arbitrary' value for 'Refined'
 arbRefined :: forall p a.
src/Predicate/Refined2.hs view
@@ -39,7 +39,6 @@   , prt2
   , prt2Impl
   , Msg2 (..)
-  , Results2 (..)
   , RResults2 (..)
 
   -- ** evaluation methods
@@ -90,6 +89,7 @@ import Data.Char (isSpace)
 import Data.Semigroup ((<>))
 import Data.String
+import Data.Hashable (Hashable(..))
 
 -- $setup
 -- >>> :set -XDataKinds
@@ -318,6 +318,12 @@             Just r -> return r
   put (Refined2 _ r) = B.put @i r
 
+-- | 'Hashable' instance for 'Refined2'
+instance (Refined2C ip op i
+        , Hashable i
+        ) => Hashable (Refined2 ip op i) where
+  hashWithSalt s (Refined2 _ b) = s + hash b
+
 withRefined2TIO :: forall ip op i m b
   . (MonadIO m, Refined2C ip op i, Show (PP ip i))
   => POpts
@@ -366,7 +372,7 @@ withRefined2T opts = (>>=) . newRefined2TP (Proxy @'(ip,op,i)) opts
 
 withRefined2TP :: forall m ip op i b proxy
-  . (Monad m, Refined2C ip op i, Show (PP ip i), Show i)
+  . (Monad m, Refined2C ip op i, Show (PP ip i))
   => proxy '(ip,op,i)
   -> POpts
   -> i
@@ -431,13 +437,6 @@     Nothing -> throwError $ m2Desc m2 <> " | " <> m2Short m2
     Just r -> return r
 
-data Results2 a =
-       XF String        -- Left e
-     | XTF a String     -- Right a + Left e
-     | XTFalse a String -- Right a + Right False
-     | XTTrue a
-     deriving (Show,Eq)
-
 -- | An ADT that summarises the results of evaluating Refined2 representing all possible states
 data RResults2 a =
        RF String (Tree PE)        -- fails initial conversion
@@ -513,7 +512,11 @@ prt2 :: Show a => POpts -> (RResults2 a, Maybe r) -> Either Msg2 r
 prt2 opts (ret,mr) = maybe (Left $ prt2Impl opts ret) Right mr
 
-data Msg2 = Msg2 { m2Desc :: String, m2Short :: String, m2Long :: String } deriving Eq
+data Msg2 = Msg2 { m2Desc :: !String
+                 , m2Short :: !String
+                 , m2Long :: !String
+                 } deriving Eq
+
 instance Show Msg2 where
   show (Msg2 a b c) = a <> " | " <> b <> (if null c then "" else "\n" <> c)
 
src/Predicate/Refined3.hs view
@@ -46,7 +46,6 @@   , prt3
   , prt3Impl
   , Msg3 (..)
-  , Results3 (..)
   , RResults3 (..)
 
   -- ** evaluation methods
@@ -114,6 +113,7 @@ import Data.Char (isSpace)
 import Data.Semigroup ((<>))
 import Data.String
+import Data.Hashable (Hashable(..))
 
 -- $setup
 -- >>> :set -XDataKinds
@@ -388,6 +388,12 @@             Just r -> return r
   put (Refined3 _ r) = B.put @i r
 
+-- | 'Hashable' instance for 'Refined3'
+instance (Refined3C ip op fmt i
+        , Hashable (PP ip i)
+        ) => Hashable (Refined3 ip op fmt i) where
+  hashWithSalt s (Refined3 a _) = s + hash a
+
 -- | creates a 4-tuple proxy (see 'withRefined3TP' 'newRefined3TP' 'eval3P' 'prtEval3P')
 --
 -- use type application to set the 4-tuple or set the individual parameters directly
@@ -602,14 +608,6 @@   Refined3 a b <- newRefined3TPSkipIPImpl (return . runIdentity) p opts (f x y)
   return (Refined3 a b)
 
-data Results3 a b =
-       XF String        -- Left e
-     | XTF a String     -- Right a + Left e
-     | XTFalse a String -- Right a + Right False
-     | XTTrueF a String -- Right a + Right True + Left e
-     | XTTrueT a b      -- Right a + Right True + Right b
-     deriving (Show,Eq)
-
 -- | An ADT that summarises the results of evaluating Refined3 representing all possible states
 data RResults3 a b =
        RF String (Tree PE)        -- Left e
@@ -736,7 +734,11 @@ prt3 :: (Show a, Show b) => POpts -> (RResults3 a b, Maybe r) -> Either Msg3 r
 prt3 opts (ret,mr) = maybe (Left $ prt3Impl opts ret) Right mr
 
-data Msg3 = Msg3 { m3Desc :: String, m3Short :: String, m3Long :: String } deriving Eq
+data Msg3 = Msg3 { m3Desc :: !String
+                 , m3Short :: !String
+                 , m3Long :: !String
+                 } deriving Eq
+
 instance Show Msg3 where
   show (Msg3 a b c) = a <> " | " <> b <> (if null c then "" else "\n" <> c)
 
@@ -832,14 +834,33 @@ type RefinedEmulate p a = Refined3 Id p Id a
 
 -- | used by 'Refined3' to extract \'ip\' from a promoted 4-tuple
+--
+-- >>> pl @(T4_1 Predicate.Examples.Refined3.Ip4) "1.2.3.4"
+-- Present [1,2,3,4] (Map [1,2,3,4] | ["1","2","3","4"])
+-- PresentT [1,2,3,4]
+--
 type family T4_1 x where
   T4_1 '(a,b,c,d) = a
 
 -- | used by 'Refined3' for extracting the boolean predicate \'op\' from a promoted 4-tuple
+--
+-- >>> pl @(T4_2 Predicate.Examples.Refined3.Ip4) [141,213,308,4]
+-- Error octet 2 out of range 0-255 found 308
+-- FailT "octet 2 out of range 0-255 found 308"
+--
+-- >>> pl @(T4_2 Predicate.Examples.Refined3.Ip4) [141,213,308,4,8]
+-- Error Guards:invalid length(5) expected 4
+-- FailT "Guards:invalid length(5) expected 4"
+--
 type family T4_2 x where
   T4_2 '(a,b,c,d) = b
 
 -- | used by 'Refined3' for extracting \'fmt\' from a promoted 4-tuple
+--
+-- >>> pl @(T4_3 Predicate.Examples.Refined3.Ip4) [141,513,9,4]
+-- Present "141.513.009.004" (PrintL(4) [141.513.009.004] | s=%03d.%03d.%03d.%03d)
+-- PresentT "141.513.009.004"
+--
 type family T4_3 x where
   T4_3 '(a,b,c,d) = c
 
src/Predicate/Util.hs view
@@ -114,6 +114,8 @@   , show1
   , showL
   , litL
+  , litBL
+  , litBS
 
   -- ** regular expressions
   , ROpt(..)
@@ -148,7 +150,6 @@   , GetNats(..)
   , GetSymbs(..)
   , GetLen(..)
-  , showThese
   , GetThese(..)
   , GetOrdering(..)
   , GetBool(..)
@@ -174,6 +175,7 @@   , MonadEval(..)
   , errorInProgram
   , readField
+  , showThese
     ) where
 import qualified GHC.TypeNats as GN
 import Data.Ratio
@@ -211,6 +213,8 @@ import qualified Text.Read.Lex as L
 import Text.ParserCombinators.ReadPrec
 import qualified GHC.Read as GR
+import qualified Data.ByteString.Lazy.Char8 as BL8
+import qualified Data.ByteString.Char8 as BS8
 
 -- $setup
 -- >>> :set -XDataKinds
@@ -218,18 +222,18 @@ -- >>> :set -XTypeOperators
 
 -- | represents the evaluation tree for predicates
-data TT a = TT { _tBool :: BoolT a  -- ^ the value at this root node
-               , _tStrings :: [String]  -- ^ detailed information eg input and output and text
-               , _tForest :: Forest PE } -- ^ the child nodes
-                deriving Show
+data TT a = TT { _tBool :: !(BoolT a)  -- ^ the value at this root node
+               , _tStrings :: ![String]  -- ^ detailed information eg input and output and text
+               , _tForest :: !(Forest PE) -- ^ the child nodes
+               } deriving Show
 
 -- | contains the typed result from evaluating the expression tree
 --
 data BoolT a where
-  FailT :: String -> BoolT a  -- failure with string
+  FailT :: !String -> BoolT a  -- failure with string
   FalseT :: BoolT Bool        -- false predicate
   TrueT :: BoolT Bool         -- true predicate
-  PresentT :: a -> BoolT a    -- non predicate value
+  PresentT :: !a -> BoolT a    -- non predicate value
 
 deriving instance Show a => Show (BoolT a)
 deriving instance Eq a => Eq (BoolT a)
@@ -342,9 +346,9 @@ newtype PColor = PColor (BoolP -> String -> String)
 
 -- | customizable options
-data POpts = POpts { oWidth :: Int -- ^ length of data to display for 'showLitImpl'
+data POpts = POpts { oWidth :: !Int -- ^ length of data to display for 'showLitImpl'
                    , oDebug :: !ODebug -- ^ debug level
-                   , oDisp :: Disp -- ^ display the tree using the normal tree or unicode
+                   , oDisp :: !Disp -- ^ display the tree using the normal tree or unicode
                    , oColor :: !(String, PColor) -- ^ color palette used
                    }
 
@@ -402,7 +406,7 @@ 
 -- | same as 'o2' for a wider display and verbose debug mode setting
 o3 :: POpts
-o3 = defOpts { oDebug = OVerbose, oWidth = 400 }
+o3 = o2 { oDebug = OVerbose, oWidth = 400 }
 
 -- | displays the detailed evaluation tree using unicode and colors. ('o2' works better on Windows)
 ou :: POpts
@@ -534,6 +538,12 @@ litL :: Int -> String -> String
 litL i s = take i s <> if length s > i then "..." else ""
 
+litBL :: Int -> BL8.ByteString -> String
+litBL i s = litL i (BL8.unpack (BL8.take (fromIntegral i+1) s))
+
+litBS :: Int -> BS8.ByteString -> String
+litBS i s = litL i (BS8.unpack (BS8.take (i+1) s))
+
 -- | Regex options for Rescan Resplit Re etc
 data ROpt =
     Anchored -- ^ Force pattern anchoring
@@ -604,7 +614,7 @@ -- | used by 'Predicate.ReplaceImpl' and 'RH.sub' and 'RH.gsub' to allow more flexible replacement
 --   These parallel the RegexReplacement (not exported) class in "Text.Regex.PCRE.Heavy" but have overlappable instances which is problematic for this code so I use 'RReplace'
 data RReplace =
-     RReplace String
+     RReplace !String
    | RReplace1 (String -> [String] -> String)
    | RReplace2 (String -> String)
    | RReplace3 ([String] -> String)
@@ -1001,7 +1011,7 @@   RepeatT n p = p ': RepeatT (n GN.- 1) p
 
 type s <%> t = GL.AppendSymbol s t
-infixr 6 <%>
+infixr 7 <%>
 
 type family IntersperseT (s :: Symbol) (xs :: [Symbol]) :: Symbol where
   IntersperseT s '[] = ""
test/TestJson.hs view
@@ -29,7 +29,8 @@   [ testCase "testperson ok" $ expectIO testPerson (() <$)
   , testCase "testperson1 ok" $ expectIO (testPerson1 2) (() <$)
   , testCase "testperson1 bad ipaddress" $ expectIO (testPerson1 3) (expectLeftWith ["octet 3 out of range 0-255 found 260"])
-  , testCase "testperson1 bad lastname lowercase first letter" $ expectIO (testPerson1 4) (expectLeftWith ["invalid name","diaz"])
+  , testCase "testperson1 bad lastname lowercase first letter" $ expectIO (testPerson1 4) (expectLeftWith ["lastName1", "invalid name", "diaz"])
+  , testCase "testperson1 bad first name lowercase first letter" $ expectIO (testPerson1 6) (expectLeftWith ["firstName1", "not upper first(d)"])
   , testCase "testperson1 age 99 out of range" $ expectIO (testPerson1 5) (expectLeftWith ["Error in $[0].age1"])
   , testCase "parse fail person1" $ expectPE (FailT "ParseJsonFile [Person1](test3.json) Error in $[0].ipaddress1") $ pl @(ParseJsonFile [Person1] "test3.json") ()
   , testCase "parse ok person1" $ expectPE (PresentT 5) $ pl @(ParseJsonFile [Person1] "test2.json" >> Len) ()
@@ -55,7 +56,7 @@ instance FromJSON Person
 
 data Person1 = Person1 {
-       firstName1 :: NameR1
+       firstName1 :: NameR2
      , lastName1 :: NameR1
      , age1 :: AgeR
      , likesPizza1 :: Bool
@@ -74,8 +75,8 @@ type Name2 =
           Uncons
        >> 'Just Id
-       >> Guard (PrintF "not upper first(%c)" Id) ('[Id] >> IsUpper)
-      *** Guard (PrintF "not lower rest(%s)" Id) IsLower
+       >> Guard (PrintF "not upper first(%c)" Id) IsUpper
+      *** Guard (PrintF "not lower rest(%s)" Id) IsLowerAll
 
 type AgeR = R.Refined (Between 10 60 Id) Int
 
test/TestPredicate.hs view
@@ -306,9 +306,9 @@   , expectPE (PresentT ([141,214,125,1,2,3333],(False,False))) $ pl @(Map (ReadP Int Id) (Resplit "\\." Id) >> '(Id, '(Len == 4, All (Between 0 255 Id) Id))) "141.214.125.1.2.3333"
   , expectPE (PresentT ([141,214,125,1,2,6],(False,True))) $ pl @(Map (ReadP Int Id) (Resplit "\\." Id) >> Id &&& ((Len == 4) &&& All (Between 0 255 Id) Id)) "141.214.125.1.2.6"
   , expectPE (FailT "ReadP Int ()") $ pl @(Resplit "\\." Id >> Map (ReadP Int Id) Id >> Id &&& ((Len == 4) &&& All (Between 0 255 Id) Id)) "141.214.125."
-  , expectPE (PresentT 9) $ pl @((Wrap _ Id *** Wrap (SG.Sum _) Id) >> Sapa >> Unwrap Id) (4,5)
-  , expectPE (PresentT (SG.Sum 9)) $ pl @((Wrap _ Id *** Wrap _ Id) >> Sapa) (4,5)
-  , expectPE (PresentT 9) $ pl @(Sapa' (SG.Sum _) >> Unwrap Id) (4,5)
+  , expectPE (PresentT 9) $ pl @((Wrap _ Id *** Wrap (SG.Sum _) Id) >> SapA >> Unwrap Id) (4,5)
+  , expectPE (PresentT (SG.Sum 9)) $ pl @((Wrap _ Id *** Wrap _ Id) >> SapA) (4,5)
+  , expectPE (PresentT 9) $ pl @(SapA' (SG.Sum _) >> Unwrap Id) (4,5)
   , expectPE (PresentT "abcde") $ pl @(ScanNA (Succ Id)) (4,'a')
   , expectPE (PresentT ["abcd","bcd","cd","d",""]) $ pl @(ScanNA (Tail Id)) (4,"abcd" :: String)
   , expectPE (PresentT ["abcd","bcd","cd","d",""]) $ pl @(Len &&& Id >> ScanNA (Tail Id)) "abcd"
@@ -428,16 +428,16 @@   , expectPE (PresentT (12, False)) $ pl @('These Id (Not Id)) (These 12 True)
   , expectPE (PresentT (SG.Any True)) $ pl @(Coerce SG.Any) True
   , expectPE (PresentT True) $ pl @(Coerce Bool) (SG.Any True)
-  , expectPE (PresentT (3, SG.Any True)) $ pl @(Id !! FromStringP _ "d" &&& (Map (Snd Id >> Gt 3 >> Coerce SG.Any) (IToList _ Id) >> MConcat Id) ) (M.fromList $ zip (map T.singleton "abcdefgh") [0 ..])
-  , expectPE (PresentT (3, True)) $ pl @(Id !! FromStringP _ "d" &&& (Map (Snd Id >> Gt 3 >> Wrap SG.Any Id) (IToList _ Id) >> MConcat Id >> Unwrap Id) ) (M.fromList $ zip (map T.singleton "abcdefgh") [0 ..])
+  , expectPE (PresentT (3, SG.Any True)) $ pl @(Id !! FromString _ "d" &&& (Map (Snd Id >> Gt 3 >> Coerce SG.Any) (IToList _ Id) >> MConcat Id) ) (M.fromList $ zip (map T.singleton "abcdefgh") [0 ..])
+  , expectPE (PresentT (3, True)) $ pl @(Id !! FromString _ "d" &&& (Map (Snd Id >> Gt 3 >> Wrap SG.Any Id) (IToList _ Id) >> MConcat Id >> Unwrap Id) ) (M.fromList $ zip (map T.singleton "abcdefgh") [0 ..])
     --- have to wrap with W cos different kinds
 --  , expectPE TrueT $ pl @(Do '[ W ('PresentT I), W 'FalseT, Not Id]) False
 --  , expectPE FalseT $ pl @(Do '[ W ('PresentT Id), W 'FalseT ]) True -- have to wrap them cos BoolT a vs BoolT Bool ie different types
 --  , expectPE TrueT $ pl @('PresentT I >> Not 'FalseT) False
   -- IxL "d" doesnt work cos is Text not String
-  , expectPE (PresentT 3) $ pl @(Id !! FromStringP _ "d") (M.fromList $ zip (map T.singleton "abcd") [0 ..])
+  , expectPE (PresentT 3) $ pl @(Id !! FromString _ "d") (M.fromList $ zip (map T.singleton "abcd") [0 ..])
   -- use Fromstring
-  , expectPE (PresentT 3) $ pl @(Id !! FromStringP _ "d") (M.fromList $ zip (map T.singleton "abcd") [0 ..])
+  , expectPE (PresentT 3) $ pl @(Id !! FromString _ "d") (M.fromList $ zip (map T.singleton "abcd") [0 ..])
   , expectPE (PresentT [7,9,9,2,7,3,9,8,7,1,3]) $ pl @(Map (ReadP Int Id) (Ones Id) >> Guard "checkdigit fail" (Luhn Id)) "79927398713"
   , expectPE (FailT "checkdigit fail") $ pl @(Map (ReadP Int Id) (Ones Id) >> Guard "checkdigit fail" (Luhn Id)) "79927398714"
   , expectPE (PresentT [10,14,15,9]) $ pl @(MM1 16 >> MM2 16) "aef9"
@@ -472,9 +472,9 @@   , (@?=) (Just 'x') ((_PresentT # 'x') ^? _PresentT)
   , expectPE (PresentT (111,'b')) $ pl @('(123,Char1 "c") >> (Id - 12 *** Pred Id)) ()
   , expectPE (PresentT (SG.Min 19)) $ pl @((FromInteger _ 12 &&& Id) >> Fst Id + Snd Id) (SG.Min 7)
-  , expectPE (PresentT (SG.Product 84)) $ pl @((FromInteger _ 12 &&& Id) >> Sapa) (SG.Product 7)
+  , expectPE (PresentT (SG.Product 84)) $ pl @((FromInteger _ 12 &&& Id) >> SapA) (SG.Product 7)
   , expectPE (PresentT "xyxyxyxy") $ pl @(STimes (Fst Id) (Snd Id)) (4,['x','y'])
-  , expectPE (PresentT (concat (replicate 16 "abc"))) $ pl @(FoldN 4 Id ((Id &&& Id) >> Sapa)) "abc"
+  , expectPE (PresentT (concat (replicate 16 "abc"))) $ pl @(FoldN 4 Id ((Id &&& Id) >> SapA)) "abc"
   , expectPE (PresentT (concat (replicate 4 "abc"))) $ pl @(STimes (Fst Id) (Snd Id)) (4,"abc")
   , expectPE (PresentT (concat (replicate 4 "abc"))) $ pl @(STimes 4 Id) "abc"
   , expectPE (PresentT "abcd") $ pl @(Map (FromEnum Id) Id >> Map (ToEnum Char Id) Id) ("abcd" :: String)
@@ -482,7 +482,7 @@   , expectPE (PresentT ([2,3,5,7,11,13], [1,4,6,8,9,10,12,14,15])) $ pl @(Partition (Prime Id) Id) [1..15]
   , expectPE (FailT "'Nothing found Just") $ pl @'Nothing (Just 12)
   , expectPE (PresentT (Just 10,((),()))) $ pl @(Id &&& '() &&& ()) (Just 10)
-  , expectPE (PresentT [(-999) % 1,10 % 1,20 % 1,(-999) % 1,30 % 1]) $ pl @(Map (Wrap (MM.First _) Id &&& (Pure Maybe (999 -% 1 ) >> Wrap (MM.First _) Id)) Id >> Map Sapa Id >> Map (Just (Unwrap Id)) Id) [Nothing,Just 10,Just 20,Nothing,Just 30]
+  , expectPE (PresentT [(-999) % 1,10 % 1,20 % 1,(-999) % 1,30 % 1]) $ pl @(Map (Wrap (MM.First _) Id &&& (Pure Maybe (999 -% 1 ) >> Wrap (MM.First _) Id)) Id >> Map SapA Id >> Map (Just (Unwrap Id)) Id) [Nothing,Just 10,Just 20,Nothing,Just 30]
   , expectPE (PresentT 12) $ pl @(MaybeIn 99 Id) (Just 12)
   , expectPE (PresentT 12) $ pl @(JustDef 99 Id) (Just 12)
   , expectPE (PresentT 99) $ pl @(MaybeIn 99 Id) Nothing
test/TestRefined2.hs view
@@ -301,6 +301,13 @@    RTFalse _ t1 t2 -> [t1,t2]
    RTTrue _ t1 t2 -> [t1,t2]
 
+data Results2 a =
+       XF String        -- Left e
+     | XTF a String     -- Right a + Left e
+     | XTFalse a String -- Right a + Right False
+     | XTTrue a
+     deriving (Show,Eq)
+
 toRResults2 :: RResults2 a -> Results2 a
 toRResults2 = \case
    RF e _ -> XF e
test/TestRefined3.hs view
@@ -175,7 +175,7 @@   , expect3 (Left (XTFalse [1,2,300,4] "Bool(2) [octet 2 out of range 0-255 found 300] (300 <= 255)")) $ eval3P ip4' ol "1.2.300.4"
   , expect3 (Right $ unsafeRefined3 [1,2,3,4,5,6,7,8,9,0,3] "1234-5678-903") $ eval3P cc11 ol "12345678903"
   , expect3 (Left $ XTFalse [1,2,3,4,5,6,7,8,9,0,1] "") $ eval3P cc11 oz "12345678901"
---  , expect3 (Right $ unsafeRefined3 True ["T","r","ue","Tr","ue"]) $ eval3P (Proxy @'(Id, Id, Do '[ShowP Id, Dup, Sapa, SplitAts '[1,1,2,2]], Bool)) True
+
   , expect3 (Right $ unsafeRefined3 ([12,13,14],TimeOfDay 12 13 14) "12:13:14") $ eval3P hms2E ol "12:13:14"
   , expect3 (Left (XTF ([12,13,99], TimeOfDay 12 13 99) "seconds invalid: found 99")) $ eval3P hms2E ol "12:13:99"
 
@@ -347,6 +347,14 @@    RTFalse _ t1 t2 -> [t1,t2]
    RTTrueF _ t1 t2 _ t3 -> [t1,t2,t3]
    RTTrueT _ t1 t2 _ t3 -> [t1,t2,t3]
+
+data Results3 a b =
+       XF String        -- Left e
+     | XTF a String     -- Right a + Left e
+     | XTFalse a String -- Right a + Right False
+     | XTTrueF a String -- Right a + Right True + Left e
+     | XTTrueT a b      -- Right a + Right True + Right b
+     deriving (Show,Eq)
 
 toRResults3 :: RResults3 a b -> Results3 a b
 toRResults3 = \case