11module Test.MySolutions where
22
33import Prelude
4+
45import Control.Alt (alt )
56import Control.Apply (lift2 )
6- import Data.Argonaut (class DecodeJson , class EncodeJson , Json , decodeJson , encodeJson , jsonParser )
7+ import Data.Argonaut (class DecodeJson , class EncodeJson , Json , JsonDecodeError (..), decodeJson , encodeJson , jsonParser , printJsonDecodeError )
78import Data.Argonaut.Decode.Generic.Rep (genericDecodeJson )
89import Data.Argonaut.Encode.Generic.Rep (genericEncodeJson )
10+ import Data.Bifunctor (lmap )
911import Data.Either (Either (..))
1012import Data.Foldable (foldr )
1113import Data.Function.Uncurried (Fn3 )
@@ -30,7 +32,7 @@ quadraticRoots poly = quadraticRootsImpl Pair poly
3032
3133foreign import valuesOfMapJson :: Json -> Json
3234
33- valuesOfMap :: Map String Int -> Either String (Set Int )
35+ valuesOfMap :: Map String Int -> Either JsonDecodeError (Set Int )
3436valuesOfMap = encodeJson >>> valuesOfMapJson >>> decodeJson
3537
3638valuesOfMapGeneric ::
@@ -41,12 +43,12 @@ valuesOfMapGeneric ::
4143 Ord k =>
4244 Ord v =>
4345 Map k v ->
44- Either String (Set v )
46+ Either JsonDecodeError (Set v )
4547valuesOfMapGeneric = encodeJson >>> valuesOfMapJson >>> decodeJson
4648
4749foreign import quadraticRootsSetJson :: Json -> Json
4850
49- quadraticRootsSet :: Quadratic -> Either String (Set Complex )
51+ quadraticRootsSet :: Quadratic -> Either JsonDecodeError (Set Complex )
5052quadraticRootsSet = encodeJson >>> quadraticRootsSetJson >>> decodeJson
5153
5254foreign import quadraticRootsSafeJson :: Json -> Json
@@ -59,18 +61,20 @@ instance decodeJsonWrapPair :: DecodeJson a => DecodeJson (WrapPair a) where
5961 decoded <- decodeJson j
6062 case decoded of
6163 [ a, b ] -> map WrapPair $ lift2 Pair (decodeJson a) (decodeJson b)
62- _ -> Left " Couldn't decode WrapPair"
64+ [ ] -> Left $ AtIndex 0 MissingValue
65+ [ a ] -> Left $ AtIndex 1 MissingValue
66+ _ -> Left $ AtIndex 2 $ UnexpectedValue j
6367
64- quadraticRootsSafeWrap :: Quadratic -> Either String (WrapPair Complex )
68+ quadraticRootsSafeWrap :: Quadratic -> Either JsonDecodeError (WrapPair Complex )
6569quadraticRootsSafeWrap = encodeJson >>> quadraticRootsSafeJson >>> decodeJson
6670
67- quadraticRootsSafe :: Quadratic -> Either String (Pair Complex )
71+ quadraticRootsSafe :: Quadratic -> Either JsonDecodeError (Pair Complex )
6872quadraticRootsSafe = quadraticRootsSafeWrap >>> map (\(WrapPair p) -> p)
6973
70- decodeArray2D :: String -> Either String (Array (Array Int ))
71- decodeArray2D str = do
74+ parseAndDecodeArray2D :: String -> Either String (Array (Array Int ))
75+ parseAndDecodeArray2D str = do
7276 j <- jsonParser str
73- decodeJson j
77+ lmap printJsonDecodeError $ decodeJson j
7478
7579data Tree a
7680 = Leaf a
@@ -100,7 +104,7 @@ instance encodeJsonIntOrString :: EncodeJson IntOrString where
100104
101105instance decodeJsonIntOrString :: DecodeJson IntOrString where
102106 decodeJson j =
103- foldr alt (Left " Could not decode IntOrString " )
107+ foldr alt (Left $ TypeMismatch " Not Int or String " )
104108 [ map IntOrString_Int $ decodeJson j
105109 , map IntOrString_String $ decodeJson j
106110 ]
0 commit comments