示例#1
0
 public CustomRW(Fn <A, string> serialize, Fn <string, Option <A> > deserialize, PrefVal.OnDeserializeFailure onDeserializeFailure, ILog log)
 {
     this.serialize            = serialize;
     this.deserialize          = deserialize;
     this.onDeserializeFailure = onDeserializeFailure;
     this.log = log;
 }
示例#2
0
 public PrefVal <Option <A> > opt <A>(
     string key, Option <A> defaultVal,
     ISerializedRW <A> aRW,
     bool saveOnEveryWrite = true,
     PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => create(key, defaultVal, PrefValRW.opt(aRW, onDeserializeFailure, log), saveOnEveryWrite);
示例#3
0
 public PrefVal <C> collection <A, C>(
     string key, ISerializedRW <C> rw, C defaultVal,
     PrefVal.OnDeserializeFailure onDeserializeFailure =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) where C : ICollection <A> =>
 custom(key, defaultVal, rw, onDeserializeFailure, log);
示例#4
0
        public PrefVal <A> base64 <A>(
            string key, A defaultVal,
            Fn <A, IEnumerable <byte[]> > serialize,
            Fn <byte[][], Option <A> > deserialize,
            bool saveOnEveryWrite = true,
            PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
            ILog log = null
            )
        {
            const char separator = '|';

            return(custom(
                       key, defaultVal,
                       a => serialize(a).Select(Convert.ToBase64String).mkString(separator),
                       base64Str => {
                try {
                    // Split on empty string gives an array with 1 empty string
                    var parts = base64Str == "" ? new byte[][] {} : base64Str.Split(separator).map(Convert.FromBase64String);
                    return deserialize(parts);
                }
                catch (FormatException) {
                    return Option <A> .None;
                }
            },
                       saveOnEveryWrite: saveOnEveryWrite,
                       onDeserializeFailure: onDeserializeFailure,
                       log: log
                       ));
        }
示例#5
0
 public PrefVal <A> custom <A>(
     string key, A defaultVal,
     Fn <A, string> serialize, Fn <string, Option <A> > deserialize,
     PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => create(
     key, defaultVal, PrefValRW.custom(serialize, deserialize, onDeserializeFailure, log)
     );
示例#6
0
 public PrefVal <A> custom <A>(
     string key, A defaultVal,
     ISerializedRW <A> aRW,
     PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => create(
     key, defaultVal, PrefValRW.custom(aRW, onDeserializeFailure, log)
     );
示例#7
0
 public PrefVal <ImmutableArray <A> > array <A>(
     string key, ISerializedRW <A> rw,
     ImmutableArray <A> defaultVal,
     PrefVal.OnDeserializeFailure onDeserializeFailure =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => collection(
     key, rw, CollectionBuilderKnownSizeFactory <A> .immutableArray, defaultVal,
     onDeserializeFailure, log
     );
示例#8
0
 public PrefVal <ImmutableHashSet <A> > hashSet <A>(
     string key, ISerializedRW <A> rw,
     ImmutableHashSet <A> defaultVal = null, bool saveOnEveryWrite = true,
     PrefVal.OnDeserializeFailure onDeserializeFailure =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => collection(
     key, rw, a => a.ToImmutableHashSet(), defaultVal ?? ImmutableHashSet <A> .Empty,
     saveOnEveryWrite, onDeserializeFailure, log
     );
示例#9
0
 public PrefVal <ImmutableArray <A> > array <A>(
     string key, ISerializedRW <A> rw,
     ImmutableArray <A> defaultVal, bool saveOnEveryWrite = true,
     PrefVal.OnDeserializeFailure onDeserializeFailure    =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => collection(
     key, rw, a => a, defaultVal, saveOnEveryWrite,
     onDeserializeFailure, log
     );
示例#10
0
 public PrefVal <ImmutableHashSet <A> > hashSet <A>(
     string key, ISerializedRW <A> rw,
     ImmutableHashSet <A> defaultVal = null,
     PrefVal.OnDeserializeFailure onDeserializeFailure =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => collection(
     key, rw, CollectionBuilderKnownSizeFactory <A> .immutableHashSet,
     defaultVal ?? ImmutableHashSet <A> .Empty,
     onDeserializeFailure, log
     );
示例#11
0
 public PrefVal <C> collection <A, C, CB>(
     string key,
     Fn <A, byte[]> serialize, Fn <byte[], Option <A> > deserialize,
     Fn <CB> createCollectionBuilder, Act <CB, A> addToCollection,
     Fn <CB, C> builderToCollection,
     C defaultVal, bool saveOnEveryWrite = true,
     PrefVal.OnDeserializeFailure onDeserializeFailure =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     PrefVal.OnDeserializeCollectionItemFailure onDeserializeCollectionItemFailure =
     PrefVal.OnDeserializeCollectionItemFailure.Ignore,
     ILog log = null
     ) where C : IEnumerable <A>
 {
     log = log ?? Log.defaultLogger;
     return(base64(
                key, defaultVal,
                c => c.Select(a => serialize(a)),
                parts => {
         var b = createCollectionBuilder();
         foreach (var partData in parts)
         {
             var deserialized = deserialize(partData);
             if (deserialized.isDefined)
             {
                 addToCollection(b, deserialized.get);
             }
             else
             {
                 if (
                     onDeserializeCollectionItemFailure ==
                     PrefVal.OnDeserializeCollectionItemFailure.Ignore
                     )
                 {
                     if (log.isWarn())
                     {
                         log.warn(deserializeCollectionItemFailureMsg <A, C>(key, partData, ", ignoring"));
                     }
                 }
                 else
                 {
                     throw new SerializationException(
                         deserializeCollectionItemFailureMsg <A, C>(key, partData)
                         );
                 }
             }
         }
         return builderToCollection(b).some();
     },
                saveOnEveryWrite: saveOnEveryWrite,
                onDeserializeFailure: onDeserializeFailure,
                log: log
                ));
 }
示例#12
0
 static PrefVal <ImmutableList <int> > create(
     ImmutableList <int> defaultVal,
     Deserialize <DeserializeInfo <int> > deserializeFn = null,
     PrefVal.OnDeserializeFailure onDeserializeFailure  =
     PrefVal.OnDeserializeFailure.ReturnDefault
     ) =>
 storage.collection(
     key,
     SerializedRW.lambda(serialize, deserializeFn ?? SerializedRW.integer.deserialize),
     convert, defaultVal,
     onDeserializeFailure: onDeserializeFailure,
     log: log
     );
示例#13
0
 public PrefVal <ImmutableHashSet <A> > hashSet <A>(
     string key,
     Fn <A, byte[]> serialize, Fn <byte[], Option <A> > deserialize,
     ImmutableHashSet <A> defaultVal = null, bool saveOnEveryWrite = true,
     PrefVal.OnDeserializeFailure onDeserializeFailure =
     PrefVal.OnDeserializeFailure.ReturnDefault,
     PrefVal.OnDeserializeCollectionItemFailure onDeserializeCollectionItemFailure =
     PrefVal.OnDeserializeCollectionItemFailure.Ignore,
     ILog log = null
     ) => collection(
     key, serialize, deserialize,
     ImmutableHashSet.CreateBuilder <A>, (b, a) => b.Add(a), b => b.ToImmutable(),
     defaultVal ?? ImmutableHashSet <A> .Empty,
     saveOnEveryWrite, onDeserializeFailure, onDeserializeCollectionItemFailure, log
     );
示例#14
0
        public PrefVal <C> collection <A, C>(
            string key,
            ISerializedRW <A> rw, CollectionBuilderKnownSizeFactory <A, C> factory,
            C defaultVal,
            PrefVal.OnDeserializeFailure onDeserializeFailure =
            PrefVal.OnDeserializeFailure.ReturnDefault,
            ILog log = null
            ) where C : ICollection <A>
        {
            var collectionRw = SerializedRW.a(
                SerializedRW.collectionSerializer <A, C>(rw),
                SerializedRW.collectionDeserializer(rw, factory)
                );

            return(collection <A, C>(
                       key, collectionRw, defaultVal, onDeserializeFailure, log
                       ));
        }
示例#15
0
 public static IPrefValueRW<A> custom<A>(
   ISerializedRW<A> aRW,
   PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
   ILog log = null
 ) => custom(
   a => Convert.ToBase64String(aRW.serialize(a).toArray()),
   s => {
     try {
       var bytes = Convert.FromBase64String(s);
       return aRW.deserialize(bytes, 0).map(_ => _.value);
     }
     catch (FormatException) {
       return Option<A>.None;
     }
   },
   onDeserializeFailure,
   log
 );
示例#16
0
        public PrefVal <A> custom <A>(
            string key, A defaultVal, Fn <A, string> serialize, Fn <string, Option <A> > deserialize,
            bool saveOnEveryWrite = true,
            PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
            ILog log = null
            )
        {
            const string defaultValue = "d", nonDefaultValueDiscriminator = "_";

            log = log ?? Log.defaultLogger;

            return(new PrefValImpl <A>(
                       key,
                       () => {
                var serialized = backend.getString(key, defaultValue);
                if (serialized == defaultValue)
                {
                    return defaultVal;
                }
                else
                {
                    var serializedWithoutDiscriminator = serialized.Substring(1);
                    var opt = deserialize(serializedWithoutDiscriminator);
                    if (opt.isDefined)
                    {
                        return opt.get;
                    }

                    if (onDeserializeFailure == PrefVal.OnDeserializeFailure.ReturnDefault)
                    {
                        if (log.isWarn())
                        {
                            log.warn(deserializeFailureMsg <A>(key, serialized, ", returning default"));
                        }
                        return defaultVal;
                    }

                    throw new SerializationException(deserializeFailureMsg <A>(key, serialized));
                }
            },
                       a => backend.setString(key, $"{nonDefaultValueDiscriminator}{serialize(a)}"),
                       backend, saveOnEveryWrite: saveOnEveryWrite
                       ));
        }
示例#17
0
 public PrefVal <A> custom <A>(
     string key, A defaultVal, Fn <A, byte[]> serialize, Fn <byte[], Option <A> > deserialize,
     bool saveOnEveryWrite = true,
     PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
     ILog log = null
     ) => custom(
     key, defaultVal,
     a => Convert.ToBase64String(serialize(a)),
     s => {
     try {
         var bytes = Convert.FromBase64String(s);
         return(deserialize(bytes));
     }
     catch (FormatException) {
         return(Option <A> .None);
     }
 },
     saveOnEveryWrite: saveOnEveryWrite, onDeserializeFailure: onDeserializeFailure, log: log
     );
示例#18
0
        public PrefVal <C> collection <A, C>(
            string key,
            ISerializedRW <A> rw, Fn <ImmutableArray <A>, C> toCollection,
            C defaultVal, bool saveOnEveryWrite = true,
            PrefVal.OnDeserializeFailure onDeserializeFailure =
            PrefVal.OnDeserializeFailure.ReturnDefault,
            ILog log = null
            ) where C : ICollection <A>
        {
            var collectionRw = SerializedRW.a(
                SerializedRW.collectionSerializer <A, C>(rw),
                SerializedRW
                .collectionDeserializer(rw)
                .map(arr => toCollection(arr).some())
                );

            return(collection <A, C>(
                       key, collectionRw, defaultVal, saveOnEveryWrite, onDeserializeFailure, log
                       ));
        }
示例#19
0
 public static IPrefValueRW<A> custom<A>(
   Fn<A, string> serialize, Fn<string, Option<A>> deserialize,
   PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
   ILog log = null
 ) => new CustomRW<A>(serialize, deserialize, onDeserializeFailure, log ?? Log.defaultLogger);
示例#20
0
 public static IPrefValueRW<Option<A>> opt<A>(
   ISerializedRW<A> baRW,
   PrefVal.OnDeserializeFailure onDeserializeFailure = PrefVal.OnDeserializeFailure.ReturnDefault,
   ILog log = null
 ) => custom(SerializedRW.opt(baRW), onDeserializeFailure, log);