LimitAliasedRecordSize provides an elm-review rule to make sure aliased records don't get too large.
There's nothing wrong with large records per se, but experience has shown that having large record aliases (for me, more than 40 fields) can lead to large memory usage when compiling (sometimes up to 10GB).
The purpose of this rule is to identify large alias records, so they can be replaced.
Compile your application and look at the verbose output like so (if you're not using Main.elm as an entry point, replace it with the appropriate file name):
elm make src/Main.elm --output=/dev/null +RTS -s -wIf garbage collection (GC) time is multiple seconds, or if the "bytes allocated in the heap" run to many gigabytes, you might benefit from this rule.
After compilation, run
du -hs elm-stuff/0.19.1/* | sort -hr | head -n 60If the largest .elmi files are run more than a few megabytes, you might benefit from this rule.
If neither of the above commands indicates a problem, and you have not experienced problems with slow build times or exhausted memory when compiling, you probably don't need this rule.
Assign the max record size allowed when configuring this rule.
import LimitAliasedRecordSize
import Review.Rule exposing (Rule)
config : List Rule
config =
[ LimitAliasedRecordSize.rule
(20 |> LimitAliasedRecordSize.maxRecordSize)
]Configure the rule in your elm-review configuration:
import LimitAliasedRecordSize
import Review.Rule exposing (Rule)
config : List Rule
config =
[ LimitAliasedRecordSize.rule
(20 |> LimitAliasedRecordSize.maxRecordSize)
]type alias MyRecord =
{ oneField : Int
, anotherField : String
, yetAnotherField : Bool
}type alias MyRecord =
{ oneField : Int
, anotherField : String
, yetAnotherField : Bool
, andAnotherField : Int
, andAnotherField2 : Int
, andAnotherField3 : Int
, andAnotherField4 : Int
, andAnotherField5 : Int
, andAnotherField6 : Int
, andAnotherField7 : Int
, andAnotherField8 : Int
, andAnotherField9 : Int
, andAnotherField10 : Int
, andAnotherField11 : Int
, andAnotherField12 : Int
, andAnotherField13 : Int
}One simple approach is just to change the record into a custom type. For example, the above bad example can be changed to:
type MyRecord
= MyRecord
{ oneField : Int
, anotherField : String
, yetAnotherField : Bool
, andAnotherField : Int
, andAnotherField2 : Int
, andAnotherField3 : Int
, andAnotherField4 : Int
, andAnotherField5 : Int
, andAnotherField6 : Int
, andAnotherField7 : Int
, andAnotherField8 : Int
, andAnotherField9 : Int
, andAnotherField10 : Int
, andAnotherField11 : Int
, andAnotherField12 : Int
, andAnotherField13 : Int
}You can try the example configuration above out by running the following command:
elm-review --template matzko/elm-review-limit-aliased-record-size/example
LimitRecordSizeConfiggets passed toruleto configure the rule. You can't contruct this type directly, but you can use themaxRecordSizefunction to create a configuration value: