concise implementation (type theoretically and computationally slightly worse)
Dependencies
- [2]
VLK55FT2initial implementation of crystal operators
Change contents
- edit in Data/Crystal.idr at line 3
import Data.Fin - edit in Data/Crystal.idr at line 5
import Control.Fold - replacement in Data/Crystal.idr at line 6
red : Fin (S n) -> Maybe (Fin n)red (FS t) = Just tred FZ = Nothing%default total - replacement in Data/Crystal.idr at line 17
scan : Ordering -> Fin n -> Maybe $ Fin $ S nscan LT FZ = Nothingscan LT (FS x) = Just $ weaken $ weaken $ xscan EQ x = Just $ weaken xscan GT x = Just $ FS $ xscan : Ordering -> Nat -> Maybe Natscan LT Z = Nothingscan LT (S x) = Just xscan EQ x = Just $ xscan GT x = Just $ S $ x - replacement in Data/Crystal.idr at line 23
scanner : Vect 3 (Fin n) -> Ordering -> Vect 3 $ Fin $ S nscanner [x, y, z] w with (scan w z)_ | Nothing = [FS x, FS x, FZ]_ | (Just v) = [FS x, weaken y, v]scanner : (Maybe $ Fin n, Nat) -> (Ordering, Fin n) -> (Maybe $ Fin n, Nat)scanner (x, y) (w, z) with (scan w y)_ | Nothing = (Just z, Z)_ | (Just v) = (x, v) - replacement in Data/Crystal.idr at line 28
init : Vect 3 (Fin 1)init = [FZ, FZ, FZ]fi : {n : Nat} -> Vect n Ordering -> Maybe $ Fin nfi a = fst $ foldl scanner (Nothing, Z) $ zip a $ allFins n - replacement in Data/Crystal.idr at line 31
fi : Vect n Ordering -> Fin $ S nfi x =let [_, p, _] = dfoldl {b = Vect 3 . Fin} scanner init x inrewrite plusCommutative 1 n in pexportpublic export - replacement in Data/Crystal.idr at line 33
e i x = pure $ replaceAt (complement !(red $ fi $ e' i <$> reverse x)) i xe i x = pure $ replaceAt (complement !(fi $ e' i <$> reverse x)) i x - replacement in Data/Crystal.idr at line 35
exportf : Nat -> Vect n Nat -> Maybe $ Vect n Natf i x = pure $ replaceAt !(red $ fi $ f' i <$> x) (S i) x[2.983]public exportf : {n : Nat} -> Nat -> Vect n Nat -> Maybe $ Vect n Natf i x = pure $ replaceAt !(fi $ f' i <$> x) (S i) x