lue-bird/elm-typesafe-array/8.0.0

NOTE: the latest version is 34.0.1

MinArr

If the maximum length is a type variable,

first :
    Arr (In (Nat1Plus orHigherMin) max) element
    -> element

use these operations instead of the ones in Arr or InArr

modify

element
-> Arr (In min max) element
-> Arr (Min (Nat1Plus min)) element

Put a new element after the others.

arrWithAtLeast5Elements
    |> MinArr.push "becomes the last"
--> : Arr (Min Nat6) String
Nat (ArgIn indexMin minLengthMinus1 indexMaybeExact)
-> LinearDirection
-> Arr (In (Nat1Plus minLengthMinus1) maxLength) element
-> Arr (In minLengthMinus1 maxLength) element

Kick out the element at an index in a direction.

removeLast arrWithAtLeast1Element =
    arrWithAtLeast1Element
        |> MinArr.removeAt nat0 LastToFirst
Nat (ArgIn indexMin minLengthMinus1 indexMaybeN)
-> LinearDirection
-> element
-> Arr (In (Nat1Plus minLengthMinus1) maxLength) element
-> Arr (Min (Nat2Plus minLengthMinus1)) element

Put a new element at an index in a direction.

arrWithAtLeast5Elements
    |> MinArr.insertAt nat0 FirstToLast
        "becomes the first"
--> : Arr (Min Nat6) String
Arr (In extensionMin extensionMax) element
-> Nat (ArgN extensionMin (Is min To extendedMin) x)
-> Arr (In min max) element
-> Arr (Min extendedMin) element

Append an Arr (In ...).

Arr.from3 1 2 3
    |> MinArr.extend nat3 arrWithAtLeast3Elements
--> : Arr (Min Nat6) ...
Nat (ArgN dropped (Is minTaken To min) x)
-> LinearDirection
-> Arr (In min max) element
-> Arr (In minTaken max) element

Elements after a certain number of elements from one side.

withAtLeast6Elements
    |> Arr.drop nat2 LastToFirst
--> : Arr (Min Nat4) ...

scan length

Nat
(ArgN
(Nat1Plus triedMinus1)
(Is a To (Nat1Plus triedMinus1PlusA))
x
)
-> { min : Nat (ArgN min (Is minToTriedMinus1 To triedMinus1) y) }
-> Arr (In min max) element
-> LessOrEqualOrGreater
(Arr (In min triedMinus1PlusA) element)
(Arr (Only (Nat1Plus triedMinus1)) element)
(Arr (Min (Nat2Plus triedMinus1)) element)

Compare the length to an exact Nat (ArgN ...). Is it LessOrEqualOrGreater?

min ensures that that Nat (ArgN ...) is bigger than the minimum length.

convertUserArguments :
    String
    -> Result String (Arr (Only Nat3))
convertUserArguments =
    let
        wordArr =
            String.words arguments
                |> Array.fromList
                |> Arr.fromArray
    in
    case wordArr |> MinArr.isLength nat3 { min = nat0 } of
        Nat.Equal only3 ->
            Ok only3


        Nat.Less atMost2 ->
            Err
                ("I need 3 arguments, but there are only "
                    ++ String.fromInt (val (Arr.length atMost2))
                    ++ "."
                )


        Nat.Greater atLeast4 ->
            Err
                ("I need exact 3 arguments, so "
                    ++ String.fromInt (val (Arr.length atLeast4))
                    ++ " is too much."
                )
Nat
(ArgN lowerBound (Is a To (Nat1Plus lowerBoundMinus1PlusA)) x)
-> { min : Nat (ArgN min (Is minToTriedMin To lowerBound) y) }
-> Arr (In min max) element
-> BelowOrAtLeast
(Arr (In min lowerBoundMinus1PlusA) element)
(Arr (Min lowerBound) element)

Compare the length to an exact Nat (ArgN ...). Is it BelowOrAtLeast that value?

min ensures that that Nat is bigger than the minimum length.

convertUserArguments : String -> Result String (Arr (Min Nat3))
convertUserArguments arguments =
    let
        wordArr =
            String.words arguments
                |> Array.fromList
                |> Arr.fromArray
    in
    case wordArr |> MinArr.isLengthAtLeast nat3 { min = nat0 } of
        Nat.EqualOrGreater atLeast3 ->
            Ok atLeast3


        Nat.Below atMost2 ->
            Err
                ("I need at least 3 arguments, but there are only "
                    ++ String.fromInt (val (Arr.length atMost2))
                    ++ "."
                )
Nat (ArgN upperBound (Is a To upperBoundPlusA) x)
-> { min : Nat (ArgN min (Is minToAtMostMin To upperBound) y) }
-> Arr (In min max) element
-> AtMostOrAbove
(Arr (In min upperBoundPlusA) element)
(Arr (Min (Nat1Plus upperBound)) element)

Is the length AtMostOrAbove a given Nat?

min ensures that that Nat is greater than the minimum length.

-- only up to 50 tags
tag : Arr (In min Nat50) String -> a -> Tagged a


tagIfValidTags : Array String -> a -> Maybe (Tagged a)
tagIfValidTags array value =
    case
        (array |> Arr.fromArray)
            |> MinArr.isLengthAtMost nat50 { min = nat0 }
    of
        Nat.EqualOrLess atMost50 ->
            tag value atMost50 |> Just


        Nat.Above _ ->
            Nothing

drop information

value : Arr (In min max) element -> Arr (Min min) element

Convert an exact Arr (In min ...) to a Nat (Min min).

between4And10Elements |> MinArr.value
--> : Arr (Min Nat4) ...

There is only 1 situation you should use this.

To make these the same type.

[ atLeast1Element, between1And10Elements ]

Elm complains:

But all the previous elements in the list are Arr (Min Nat1) ...

[ atLeast1Element
, between1And10Elements |> MinArr.value
]

extra

Nat
(ArgN lowerBound (Is a To (Nat1Plus lowerBoundMinus1PlusA)) x)
-> Codec String element
-> Codec String (Arr (Min lowerBound) element)

A Codec to serialize Arrs with a minimum amount of elements.

import Serialize




-- we can't start if we have no worlds to choose from!
serializeSaves :
    Serialize.Codec
        String
        (Arr (Min Nat1) World)
serializeSaves =
    MinArr.serialize nat1 serializeWorld


encode : Arr (In (Nat1Plus minMinus1) max) World -> Bytes
encode =
    MinArr.value
        >> Serialize.encodeToBytes serializeSaves


decode :
    Bytes
    ->
        Result
            (Serialize.Error String)
            (Arr (Min Nat1) World)
decode =
    Serialize.decodeFromBytes serializeSaves