✨ Add exercice number 3 - Ord
This commit is contained in:
parent
f3a5b79512
commit
c0ca5d234c
3 changed files with 164 additions and 0 deletions
104
src/exo3/exo3.test.ts
Normal file
104
src/exo3/exo3.test.ts
Normal file
|
@ -0,0 +1,104 @@
|
|||
import * as Option from 'fp-ts/lib/Option';
|
||||
|
||||
import {
|
||||
sortStrings,
|
||||
sortNumbers,
|
||||
sortNumbersDescending,
|
||||
sortOptionalNumbers,
|
||||
sortPersonsByName,
|
||||
sortPersonsByAge,
|
||||
sortPersonsByAgeThenByName,
|
||||
} from './exo3';
|
||||
|
||||
describe('exo3', () => {
|
||||
describe('sortStrings', () => {
|
||||
it('should return an alphabetically sorted array of strings', () => {
|
||||
const strings = ['xyz', 'aba', 'ori', 'aab', 'ghl'];
|
||||
|
||||
const result = sortStrings(strings);
|
||||
const expected = ['aab', 'aba', 'ghl', 'ori', 'xyz'];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('sortNumbers', () => {
|
||||
it('should return a sorted array of numbers', () => {
|
||||
const numbers = [1337, 42, 5701];
|
||||
|
||||
const result = sortNumbers(numbers);
|
||||
const expected = [42, 1337, 5701];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('sortNumbersDescending', () => {
|
||||
it('should return a sorted array of descending numbers', () => {
|
||||
const numbers = [1337, 42, 5701];
|
||||
|
||||
const result = sortNumbersDescending(numbers);
|
||||
const expected = [5701, 1337, 42];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('sortOptionalNumbers', () => {
|
||||
it('should return a sorted array of optional numbers', () => {
|
||||
const optionalNumbers = [Option.some(1337), Option.none, Option.some(42)];
|
||||
|
||||
const result = sortOptionalNumbers(optionalNumbers);
|
||||
const expected = [Option.none, Option.some(42), Option.some(1337)];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('sortPersonsByName', () => {
|
||||
it('should return an array of persons alphabetically sorted by their name', () => {
|
||||
const alice = { name: 'Alice', age: Option.none };
|
||||
const bob = { name: 'Bob', age: Option.none };
|
||||
const crystal = { name: 'Crystal', age: Option.none };
|
||||
|
||||
const persons = [crystal, alice, bob];
|
||||
|
||||
const result = sortPersonsByName(persons);
|
||||
const expected = [alice, bob, crystal];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('sortPersonsByName', () => {
|
||||
it('should return an array of persons sorted by their age', () => {
|
||||
const alice = { name: 'Alice', age: Option.some(42) };
|
||||
const bob = { name: 'Bob', age: Option.none };
|
||||
const crystal = { name: 'Crystal', age: Option.some(29) };
|
||||
|
||||
const persons = [crystal, alice, bob];
|
||||
|
||||
const result = sortPersonsByAge(persons);
|
||||
const expected = [bob, crystal, alice];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
|
||||
describe('sortPersonsByName', () => {
|
||||
it('should return an array of persons sorted first by age and then by name', () => {
|
||||
const alice = { name: 'Alice', age: Option.some(42) };
|
||||
const bob = { name: 'Bob', age: Option.none };
|
||||
const crystal = { name: 'Crystal', age: Option.some(29) };
|
||||
const dorian = { name: 'Dorian', age: Option.some(29) };
|
||||
const edgar = { name: 'Edgar', age: Option.none };
|
||||
|
||||
const persons = [dorian, alice, edgar, bob, crystal];
|
||||
|
||||
const result = sortPersonsByAgeThenByName(persons);
|
||||
const expected = [bob, edgar, crystal, dorian, alice];
|
||||
|
||||
expect(result).toStrictEqual(expected);
|
||||
});
|
||||
});
|
||||
});
|
59
src/exo3/exo3.ts
Normal file
59
src/exo3/exo3.ts
Normal file
|
@ -0,0 +1,59 @@
|
|||
// `fp-ts` training Exercice 3
|
||||
// Sort things out with `Ord`
|
||||
|
||||
import * as Option from 'fp-ts/lib/Option';
|
||||
|
||||
import { unimplemented } from '../utils';
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// SORT PRIMITIVE TYPES //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export const sortStrings: (
|
||||
strings: ReadonlyArray<string>,
|
||||
) => ReadonlyArray<string> = unimplemented;
|
||||
|
||||
export const sortNumbers: (
|
||||
numbers: ReadonlyArray<number>,
|
||||
) => ReadonlyArray<number> = unimplemented;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// REVERSE SORT //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export const sortNumbersDescending: (
|
||||
numbers: ReadonlyArray<number>,
|
||||
) => ReadonlyArray<number> = unimplemented;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// SORT OPTIONAL VALUES //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export const sortOptionalNumbers: (
|
||||
optionalNumbers: ReadonlyArray<Option.Option<number>>,
|
||||
) => ReadonlyArray<Option.Option<number>> = unimplemented;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// SORT COMPLEX OBJECTS //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export interface Person {
|
||||
readonly name: string;
|
||||
readonly age: Option.Option<number>;
|
||||
}
|
||||
|
||||
export const sortPersonsByName: (
|
||||
person: ReadonlyArray<Person>,
|
||||
) => ReadonlyArray<Person> = unimplemented;
|
||||
|
||||
export const sortPersonsByAge: (
|
||||
person: ReadonlyArray<Person>,
|
||||
) => ReadonlyArray<Person> = unimplemented;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// COMBINE SORTING SCHEMES //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
export const sortPersonsByAgeThenByName: (
|
||||
person: ReadonlyArray<Person>,
|
||||
) => ReadonlyArray<Person> = unimplemented;
|
1
src/exo3/index.ts
Normal file
1
src/exo3/index.ts
Normal file
|
@ -0,0 +1 @@
|
|||
export * from './exo3';
|
Reference in a new issue