|
|
@@ -1,9 +1,10 @@
|
|
|
-module Database exposing (Database, decode, decoder, get, getAll)
|
|
|
+module Database exposing (Database, decode, decoder, encode, fromCardData, get, getAll)
|
|
|
|
|
|
import Card exposing (CardData, CardDetails, CardPerformanceData, CardType(..), ManaColor(..), Power(..), parseManaCost)
|
|
|
import Dict exposing (Dict)
|
|
|
import Json.Decode as Decode exposing (Decoder, decodeString)
|
|
|
import Json.Decode.Pipeline exposing (optional, required)
|
|
|
+import Json.Encode as Encode
|
|
|
import Tuple exposing (pair)
|
|
|
|
|
|
|
|
|
@@ -11,6 +12,13 @@ type Database
|
|
|
= Database (Dict String CardData)
|
|
|
|
|
|
|
|
|
+fromCardData : List CardData -> Database
|
|
|
+fromCardData cards =
|
|
|
+ List.map (\card -> ( card.details.name, card )) cards
|
|
|
+ |> Dict.fromList
|
|
|
+ |> Database
|
|
|
+
|
|
|
+
|
|
|
get : String -> Database -> Maybe CardData
|
|
|
get name (Database db) =
|
|
|
Dict.get name db
|
|
|
@@ -40,6 +48,24 @@ decoder =
|
|
|
)
|
|
|
|
|
|
|
|
|
+databaseToDict : Database -> Dict String CardData
|
|
|
+databaseToDict (Database db) =
|
|
|
+ db
|
|
|
+
|
|
|
+
|
|
|
+encode : ( String, Database ) -> Encode.Value
|
|
|
+encode ( setCode, Database db ) =
|
|
|
+ Encode.object
|
|
|
+ [ ( "code", Encode.string setCode )
|
|
|
+ , ( "data"
|
|
|
+ , Encode.object
|
|
|
+ [ ( "ratings", Encode.list encodeCardPerformance (Dict.values db) )
|
|
|
+ , ( "cards", Encode.list encodeCardDetails (Dict.values db) )
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
createDatabase : Dict String CardPerformanceData -> Dict String CardDetails -> Database
|
|
|
createDatabase performanceData detailsData =
|
|
|
Dict.merge
|
|
|
@@ -64,6 +90,28 @@ decodeSetData =
|
|
|
|> Decode.map Dict.fromList
|
|
|
|
|
|
|
|
|
+encodeCardPerformance : CardData -> Encode.Value
|
|
|
+encodeCardPerformance d =
|
|
|
+ Encode.object
|
|
|
+ [ ( "Name", Encode.string d.details.name )
|
|
|
+ , ( "# Seen", encodeIntString d.performance.totalTimesSeen )
|
|
|
+ , ( "# Picked", encodeIntString d.performance.totalTimesPicked )
|
|
|
+ , ( "ATA", encodeMaybeFloatString d.performance.averagePickPosition )
|
|
|
+ , ( "ALSA", encodeMaybeFloatString d.performance.averageSeenPosition )
|
|
|
+ , ( "GIH WR", encodeMaybePercentageString d.performance.gameInHandWinRate )
|
|
|
+ , ( "IWD"
|
|
|
+ , Encode.string
|
|
|
+ (case d.performance.improvementWhenDrawn of
|
|
|
+ Just i ->
|
|
|
+ String.fromFloat i ++ "pp"
|
|
|
+
|
|
|
+ Nothing ->
|
|
|
+ ""
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
decodeCardPerformance : Decoder ( String, CardPerformanceData )
|
|
|
decodeCardPerformance =
|
|
|
Decode.map2 pair
|
|
|
@@ -96,6 +144,11 @@ decodeImprovementWhenDrawn =
|
|
|
)
|
|
|
|
|
|
|
|
|
+encodeIntString : Int -> Encode.Value
|
|
|
+encodeIntString i =
|
|
|
+ Encode.string (String.fromInt i)
|
|
|
+
|
|
|
+
|
|
|
decodeIntString : Decoder Int
|
|
|
decodeIntString =
|
|
|
Decode.string
|
|
|
@@ -110,6 +163,16 @@ decodeIntString =
|
|
|
)
|
|
|
|
|
|
|
|
|
+encodeMaybeFloatString : Maybe Float -> Encode.Value
|
|
|
+encodeMaybeFloatString m =
|
|
|
+ case m of
|
|
|
+ Just f ->
|
|
|
+ Encode.string (String.fromFloat f)
|
|
|
+
|
|
|
+ Nothing ->
|
|
|
+ Encode.string ""
|
|
|
+
|
|
|
+
|
|
|
decodeMaybeFloatString : Decoder (Maybe Float)
|
|
|
decodeMaybeFloatString =
|
|
|
Decode.string
|
|
|
@@ -128,6 +191,16 @@ decodeMaybeFloatString =
|
|
|
)
|
|
|
|
|
|
|
|
|
+encodeMaybePercentageString : Maybe Float -> Encode.Value
|
|
|
+encodeMaybePercentageString m =
|
|
|
+ case m of
|
|
|
+ Just f ->
|
|
|
+ Encode.string (String.fromFloat (f * 100) ++ "%")
|
|
|
+
|
|
|
+ Nothing ->
|
|
|
+ Encode.string ""
|
|
|
+
|
|
|
+
|
|
|
decodeMaybePercentageString : Decoder (Maybe Float)
|
|
|
decodeMaybePercentageString =
|
|
|
Decode.string
|
|
|
@@ -146,6 +219,28 @@ decodeMaybePercentageString =
|
|
|
)
|
|
|
|
|
|
|
|
|
+encodeCardDetails : CardData -> Encode.Value
|
|
|
+encodeCardDetails card =
|
|
|
+ Encode.object
|
|
|
+ [ ( "name", Encode.string card.details.name )
|
|
|
+ , ( "cmc", Encode.int card.details.cmc )
|
|
|
+ , ( "type_line", Encode.string card.details.typeLine )
|
|
|
+ , ( "oracle_text"
|
|
|
+ , case card.details.oracleText of
|
|
|
+ Just t ->
|
|
|
+ Encode.string t
|
|
|
+
|
|
|
+ Nothing ->
|
|
|
+ Encode.null
|
|
|
+ )
|
|
|
+ , ( "power", encodePower card.details.power )
|
|
|
+ , ( "toughness", encodePower card.details.toughness )
|
|
|
+ , ( "colors", Encode.list encodeManaColor card.details.colors )
|
|
|
+ , ( "mana_cost", Encode.string card.details.rawManaCost )
|
|
|
+ , ( "image_uris", Encode.object [ ( "large", Encode.string card.details.imageUrl ) ] )
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
decodeCardDetails : Decoder ( String, CardDetails )
|
|
|
decodeCardDetails =
|
|
|
Decode.map2 pair
|
|
|
@@ -159,6 +254,7 @@ decodeCardDetails =
|
|
|
|> optional "power" (Decode.nullable decodePower) Nothing
|
|
|
|> optional "toughness" (Decode.nullable decodePower) Nothing
|
|
|
|> required "colors" (Decode.list decodeManaColor)
|
|
|
+ |> required "mana_cost" Decode.string
|
|
|
|> required "mana_cost"
|
|
|
(Decode.string
|
|
|
|> Decode.andThen
|
|
|
@@ -175,6 +271,19 @@ decodeCardDetails =
|
|
|
)
|
|
|
|
|
|
|
|
|
+encodePower : Maybe Power -> Encode.Value
|
|
|
+encodePower p =
|
|
|
+ case p of
|
|
|
+ Just (ConstantPower i) ->
|
|
|
+ Encode.string (String.fromInt i)
|
|
|
+
|
|
|
+ Just VariablePower ->
|
|
|
+ Encode.string "*"
|
|
|
+
|
|
|
+ Nothing ->
|
|
|
+ Encode.null
|
|
|
+
|
|
|
+
|
|
|
decodePower : Decoder Power
|
|
|
decodePower =
|
|
|
Decode.string
|
|
|
@@ -193,6 +302,28 @@ decodePower =
|
|
|
)
|
|
|
|
|
|
|
|
|
+encodeManaColor : ManaColor -> Encode.Value
|
|
|
+encodeManaColor c =
|
|
|
+ case c of
|
|
|
+ Red ->
|
|
|
+ Encode.string "R"
|
|
|
+
|
|
|
+ Blue ->
|
|
|
+ Encode.string "U"
|
|
|
+
|
|
|
+ Green ->
|
|
|
+ Encode.string "G"
|
|
|
+
|
|
|
+ White ->
|
|
|
+ Encode.string "W"
|
|
|
+
|
|
|
+ Black ->
|
|
|
+ Encode.string "B"
|
|
|
+
|
|
|
+ Colorless ->
|
|
|
+ Encode.string "C"
|
|
|
+
|
|
|
+
|
|
|
decodeManaColor : Decoder ManaColor
|
|
|
decodeManaColor =
|
|
|
Decode.string
|