Skip to content

move from json encoders/decoders to elm-serialize's codecs #52

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
6 changes: 4 additions & 2 deletions elm.json
Original file line number Diff line number Diff line change
@@ -6,9 +6,13 @@
"elm-version": "0.19.1",
"dependencies": {
"direct": {
"bburdette/toop": "1.2.0",
"danfishgold/base64-bytes": "1.1.0",
"dasch/levenshtein": "1.0.3",
"elm/bytes": "1.0.8",
"elm/core": "1.0.5",
"elm/json": "1.1.3",
"elm/regex": "1.0.0",
"elm/time": "1.0.0",
"elm/url": "1.0.0",
"elm-community/array-extra": "2.6.0",
@@ -24,7 +28,6 @@
"indirect": {
"andre-dietrich/parser-combinators": "4.1.0",
"elm/parser": "1.1.0",
"elm/regex": "1.0.0",
"fredcy/elm-parseint": "2.0.1",
"pilatch/flip": "1.0.0",
"zwilias/elm-rosetree": "1.5.0"
@@ -35,7 +38,6 @@
"elm-explorations/test": "2.2.0"
},
"indirect": {
"elm/bytes": "1.0.8",
"elm/html": "1.0.0",
"elm/random": "1.0.0",
"elm/virtual-dom": "1.0.3"
19 changes: 9 additions & 10 deletions src/Builder/BackgroundWriter.elm
Original file line number Diff line number Diff line change
@@ -5,8 +5,7 @@ module Builder.BackgroundWriter exposing
)

import Builder.File as File
import Json.Decode as Decode
import Json.Encode as Encode
import Serialize exposing (Codec)
import System.IO as IO exposing (IO)
import Utils.Main as Utils

@@ -21,39 +20,39 @@ type Scope

withScope : (Scope -> IO a) -> IO a
withScope callback =
Utils.newMVar (Encode.list (\_ -> Encode.null)) []
Utils.newMVar (Serialize.list Utils.mVarCodec) []
|> IO.bind
(\workList ->
callback (Scope workList)
|> IO.bind
(\result ->
Utils.takeMVar (Decode.list Utils.mVarDecoder) workList
Utils.takeMVar (Serialize.list Utils.mVarCodec) workList
|> IO.bind
(\mvars ->
Utils.listTraverse_ (Utils.takeMVar (Decode.succeed ())) mvars
Utils.listTraverse_ (Utils.takeMVar Serialize.unit) mvars
|> IO.fmap (\_ -> result)
)
)
)


writeBinary : (a -> Encode.Value) -> Scope -> String -> a -> IO ()
writeBinary encoder (Scope workList) path value =
writeBinary : Codec e a -> Scope -> String -> a -> IO ()
writeBinary codec (Scope workList) path value =
Utils.newEmptyMVar
|> IO.bind
(\mvar ->
Utils.forkIO (File.writeBinary encoder path value |> IO.bind (\_ -> Utils.putMVar (\_ -> Encode.object []) mvar ()))
Utils.forkIO (File.writeBinary codec path value |> IO.bind (\_ -> Utils.putMVar Serialize.unit mvar ()))
|> IO.bind
(\_ ->
Utils.takeMVar (Decode.list Utils.mVarDecoder) workList
Utils.takeMVar (Serialize.list Utils.mVarCodec) workList
|> IO.bind
(\oldWork ->
let
newWork : List (Utils.MVar ())
newWork =
mvar :: oldWork
in
Utils.putMVar (Encode.list Utils.mVarEncoder) workList newWork
Utils.putMVar (Serialize.list Utils.mVarCodec) workList newWork
)
)
)
850 changes: 273 additions & 577 deletions src/Builder/Build.elm

Large diffs are not rendered by default.

56 changes: 22 additions & 34 deletions src/Builder/Deps/Registry.elm
Original file line number Diff line number Diff line change
@@ -6,8 +6,7 @@ module Builder.Deps.Registry exposing
, getVersions_
, latest
, read
, registryDecoder
, registryEncoder
, registryCodec
, update
)

@@ -20,11 +19,10 @@ import Builder.Stuff as Stuff
import Compiler.Elm.Package as Pkg
import Compiler.Elm.Version as V
import Compiler.Json.Decode as D
import Compiler.Json.Encode as E
import Compiler.Parse.Primitives as P
import Compiler.Serialize as S
import Data.Map as Dict exposing (Dict)
import Json.Decode as Decode
import Json.Encode as Encode
import Serialize exposing (Codec)
import System.IO as IO exposing (IO)


@@ -40,19 +38,14 @@ type KnownVersions
= KnownVersions V.Version (List V.Version)


knownVersionsDecoder : Decode.Decoder KnownVersions
knownVersionsDecoder =
Decode.map2 KnownVersions
(Decode.field "version" V.jsonDecoder)
(Decode.field "versions" (Decode.list V.jsonDecoder))


knownVersionsEncoder : KnownVersions -> Encode.Value
knownVersionsEncoder (KnownVersions version versions) =
Encode.object
[ ( "version", V.jsonEncoder version )
, ( "versions", Encode.list V.jsonEncoder versions )
]
knownVersionsCodec : Codec e KnownVersions
knownVersionsCodec =
Serialize.customType
(\knownVersionsCodecEncoder (KnownVersions version versions) ->
knownVersionsCodecEncoder version versions
)
|> Serialize.variant2 KnownVersions V.jsonCodec (Serialize.list V.jsonCodec)
|> Serialize.finishCustomType



@@ -61,7 +54,7 @@ knownVersionsEncoder (KnownVersions version versions) =

read : Stuff.PackageCache -> IO (Maybe Registry)
read cache =
File.readBinary registryDecoder (Stuff.registry cache)
File.readBinary registryCodec (Stuff.registry cache)



@@ -85,7 +78,7 @@ fetch manager cache =
path =
Stuff.registry cache
in
File.writeBinary registryEncoder path registry
File.writeBinary registryCodec path registry
|> IO.fmap (\_ -> registry)


@@ -143,7 +136,7 @@ update manager cache ((Registry size packages) as oldRegistry) =
newRegistry =
Registry newSize newPkgs
in
File.writeBinary registryEncoder (Stuff.registry cache) newRegistry
File.writeBinary registryCodec (Stuff.registry cache) newRegistry
|> IO.fmap (\_ -> newRegistry)


@@ -249,16 +242,11 @@ post manager path decoder callback =
-- ENCODERS and DECODERS


registryDecoder : Decode.Decoder Registry
registryDecoder =
Decode.map2 Registry
(Decode.field "size" Decode.int)
(Decode.field "packages" (D.assocListDict identity Pkg.nameDecoder knownVersionsDecoder))


registryEncoder : Registry -> Encode.Value
registryEncoder (Registry size versions) =
Encode.object
[ ( "size", Encode.int size )
, ( "packages", E.assocListDict Pkg.compareName Pkg.nameEncoder knownVersionsEncoder versions )
]
registryCodec : Codec e Registry
registryCodec =
Serialize.customType
(\registryCodecEncoder (Registry size packages) ->
registryCodecEncoder size packages
)
|> Serialize.variant2 Registry Serialize.int (S.assocListDict identity Pkg.compareName Pkg.nameCodec knownVersionsCodec)
|> Serialize.finishCustomType
83 changes: 28 additions & 55 deletions src/Builder/Deps/Solver.elm
Original file line number Diff line number Diff line change
@@ -7,8 +7,7 @@ module Builder.Deps.Solver exposing
, SolverResult(..)
, State
, addToApp
, envDecoder
, envEncoder
, envCodec
, initEnv
, verify
)
@@ -25,8 +24,7 @@ import Compiler.Elm.Package as Pkg
import Compiler.Elm.Version as V
import Compiler.Json.Decode as D
import Data.Map as Dict exposing (Dict)
import Json.Decode as Decode
import Json.Encode as Encode
import Serialize exposing (Codec)
import System.IO as IO exposing (IO)
import Utils.Crash exposing (crash)
import Utils.Main as Utils
@@ -447,7 +445,7 @@ initEnv =
Utils.newEmptyMVar
|> IO.bind
(\mvar ->
Utils.forkIO (IO.bind (Utils.putMVar Http.managerEncoder mvar) Http.getManager)
Utils.forkIO (IO.bind (Utils.putMVar Http.managerCodec mvar) Http.getManager)
|> IO.bind
(\_ ->
Stuff.getPackageCache
@@ -457,7 +455,7 @@ initEnv =
(Registry.read cache
|> IO.bind
(\maybeRegistry ->
Utils.readMVar Http.managerDecoder mvar
Utils.readMVar Http.managerCodec mvar
|> IO.bind
(\manager ->
case maybeRegistry of
@@ -585,52 +583,27 @@ foldM f b =
-- ENCODERS and DECODERS


envEncoder : Env -> Encode.Value
envEncoder (Env cache manager connection registry) =
Encode.object
[ ( "cache", Stuff.packageCacheEncoder cache )
, ( "manager", Http.managerEncoder manager )
, ( "connection", connectionEncoder connection )
, ( "registry", Registry.registryEncoder registry )
]


envDecoder : Decode.Decoder Env
envDecoder =
Decode.map4 Env
(Decode.field "cache" Stuff.packageCacheDecoder)
(Decode.field "manager" Http.managerDecoder)
(Decode.field "connection" connectionDecoder)
(Decode.field "registry" Registry.registryDecoder)


connectionEncoder : Connection -> Encode.Value
connectionEncoder connection =
case connection of
Online manager ->
Encode.object
[ ( "type", Encode.string "Online" )
, ( "manager", Http.managerEncoder manager )
]

Offline ->
Encode.object
[ ( "type", Encode.string "Offline" )
]


connectionDecoder : Decode.Decoder Connection
connectionDecoder =
Decode.field "type" Decode.string
|> Decode.andThen
(\type_ ->
case type_ of
"Online" ->
Decode.map Online (Decode.field "manager" Http.managerDecoder)

"Offline" ->
Decode.succeed Offline

_ ->
Decode.fail ("Failed to decode Connection's type: " ++ type_)
)
envCodec : Codec e Env
envCodec =
Serialize.customType
(\envCodecEncoder (Env cache manager connection registry) ->
envCodecEncoder cache manager connection registry
)
|> Serialize.variant4 Env Stuff.packageCacheCodec Http.managerCodec connectionCodec Registry.registryCodec
|> Serialize.finishCustomType


connectionCodec : Codec e Connection
connectionCodec =
Serialize.customType
(\onlineEncoder offlineEncoder value ->
case value of
Online manager ->
onlineEncoder manager

Offline ->
offlineEncoder
)
|> Serialize.variant1 Online Http.managerCodec
|> Serialize.variant0 Offline
|> Serialize.finishCustomType
Loading
Oops, something went wrong.
Loading
Oops, something went wrong.