lue-bird/elm-typesafe-array/9.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
Nat (ArgN extensionMin (Is min To sumMin) x)
-> Arr (In extensionMin extensionMax) element
-> Arr (In min max) element
-> Arr (Min sumMin) 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
)
-> { lowest :
Nat
(ArgN
lowest
(Is lowestToMin To min)
(Is minToTriedMinus1 To triedMinus1)
)
}
-> Arr (In min max) element
-> LessOrEqualOrGreater
(Arr (In lowest triedMinus1PlusA) element)
(Arr (Only (Nat1Plus triedMinus1)) element)
(Arr (Min (Nat2Plus triedMinus1)) element)

Compare its length to a given exact length. Is it LessOrEqualOrGreater?

lowest can be a number <= 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 { lowest = 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)
-> { lowest :
Nat
(ArgN
lowest
(Is lowestToMin To min)
(Is minToTriedMin To lowerBound)
)
}
-> Arr (In min max) element
-> BelowOrAtLeast
(Arr (In lowest lowerBoundMinus1PlusA) element)
(Arr (Min lowerBound) element)

Compare its length to a given exact length. Is it BelowOrAtLeast that value?

lowest can be a number <= 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 { lowest = 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)
-> { lowest :
Nat
(ArgN
lowest
(Is lowestToMin To min)
(Is minToAtMostMin To upperBound)
)
}
-> Arr (In min max) element
-> AtMostOrAbove
(Arr (In lowest upperBoundPlusA) element)
(Arr (Min (Nat1Plus upperBound)) element)

Is its length AtMostOrAbove a given length?

lowest can be a number <= 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 { lowest = 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 the Arr (In min ...) to a Arr (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
        >> Arr.lowerMinLength nat1
        >> Serialize.encodeToBytes serializeSaves


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